Laden...

Wie kann ich das scrollen in zwei RichTextBoxen synchronisieren?

Erstellt von Krumnix vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.885 Views
K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 6 Jahren
Wie kann ich das scrollen in zwei RichTextBoxen synchronisieren?

Hallo.

Habe 2 RichTextBoxen in ein Form drin und würde gerne beim Scrollen in der einen TextBox (egal ob mit Maus, per Pfeiltasten oder auf der Scroll Leiste) der gleiche Wert in der anderen Box gescrollt wird.

Jemand einen Tipp, wie und wo ich das umsetzen kann?

Danke!

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Krumnix,

wo sind wir? Forms? WPF?

Gruss

Coffeebean

K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 6 Jahren

Windows Form ohne spezielle Anpassungen.

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Krumnix,

hilft dir C#: Synchronize Scroll Position of two RichTextBoxes? ?

Gruss

Coffeebean

K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 6 Jahren

Nicht ganz 😃

Es läuft zwar, habe aber das gleiche Problem wie der Kollege am Ende des Threads bei zu viel Text in der richTextBox.

Ich suche dazu noch ne Lösung.

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Krumnix,

ich habe den Thread nur überflogen.

Es läuft zwar, [...] aber

Kannst du dann bitte deine Frage präzisieren? Um was geht es genau? Was genau läuft nicht? Kannst du nicht parallel scrollen? Oder kannst du parallel Scrollen aber bei zuviel Text passiert etwas unerwartetes? Wenn ja: Was passiert?

Gruss

Coffeebean

K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 6 Jahren

Hab den Fehler gefunden. Problem ist, dass npos nur ein "int" ist, welches halt bei großen Texten schnell in den Überlauf geht.

Hab mal testweise npos als int32 deklariert und damit scheint es zu funktionieren.

Selbst meine größte Datei hat keinen Überlauf mehr erzeugt.

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Krumnix,

du hast nicht eine Frage von mir beantwortet 😃 bitte hilf mir ein bisschen den Titel entsprechend deines Problems zu formulieren! Nochmal: War dein Problem in den Textboxen zu scrollen oder gab es ein Problem bei einem zu langem Text? Gab es eine Stackoverflowexception?

Hilfesuchende sehen nur den Titel und entscheiden dann ob der Thread hilfreich ist oder nicht. Deine Problemlösung passt derzeit nicht auf den Titel. Daher: Was war denn dein Problem?

Gruss

Coffeebean

5.658 Beiträge seit 2006
vor 6 Jahren

Hab mal testweise npos als int32 deklariert und damit scheint es zu funktionieren.

Int32 und int ist der gleiche Datentyp. Daran kann es also nicht gelegen haben. Ganz abgesehen davon: Wenn du mehr als 4 Mrd. Zeichen in deinem Text hast, ist die RichTextBox auch die falsche Herangehensweise.

Weeks of programming can save you hours of planning

K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 6 Jahren

Ja, korrekt.

Folgendes Problem war:

  • 2 RichTextBoxen in einer Windows Form
  • Wenn in einer Box gescrollt wird, soll die andere automatisch mit scrollen

  • der Link von dir hatte die Lösung
  • nach dem implementieren lief es zuerst, ergab aber bei großen Texten (>2000 Zeilen) eine OverflowException (npos).

  • nach Anpassung von npos als Int32 konnte das Problem beseitigt werden

Nun können in beiden richTextBoxen gescrollt werden, und die andere scrollt automatisch mit.

Was muss man tun (C# VS2015):
1.


static class Program
    {
        [System.Runtime.InteropServices.DllImport("User32.dll")]
        public extern static int GetScrollPos(IntPtr hWnd, int nBar);
        [System.Runtime.InteropServices.DllImport("User32.dll")]
        public extern static int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()


private void richTextBox1_VScroll(object sender, EventArgs e)
        {
            if (richTextBox1.Focused == true)
            {
                Int32 nPos = Program.GetScrollPos(richTextBox1.Handle, 1);
                nPos <<= 16;
                uint wParam = 4 | (uint)nPos;
                Program.SendMessage(richTextBox2.Handle, 0x0115, new IntPtr(wParam), new IntPtr(0));
            }
        }


 private void richTextBox2_VScroll(object sender, EventArgs e)
        {
            if (richTextBox2.Focused == true)
            {
                Int32 nPos = Program.GetScrollPos(richTextBox2.Handle, 1);
                nPos <<= 16;
                uint wParam = 4 | (uint)nPos;
                Program.SendMessage(richTextBox1.Handle, 0x0115, new IntPtr(wParam), new IntPtr(0));
            }
        }
309 Beiträge seit 2008
vor 6 Jahren

Das Problem mit dem Überlauf besteht weiterhin.
Int32 und int sind, wie schon angemerkt der gleiche Datentyp.

Das Problem lässt sich leider nicht (so einfach) lösen, da die verwendeten Windowsfunktionen nur 32bit Werte als Paramter haben und es keine 64bit Versionen gibt.

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}