Laden...

Richtextbox - alignment springt hin und her

Erstellt von Kreater vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.207 Views
Thema geschlossen
K
Kreater Themenstarter:in
3 Beiträge seit 2012
vor 10 Jahren
Richtextbox - alignment springt hin und her

Hallo,

ich habe derzeit ein kleines Problem mit der RichTextBox.

Ich gebe in der RichTextBox im Interwall von x millisekunden alle Wörter eines arrays nach und nach aus, dies funktioniert einwandfrei.
Der Text ist auf Zentriert gesetzt springt jedoch bei der Ausgabe hin und her.

Beispiel:
Soll:
[Zentriert]Wort1
[Zentriert]Wort2
[Zentriert]Wort3
[Zentriert]Wort4
[Zentriert]Wort5

Ist:
[Zentriert]Wort1
[Linksbuendig]Wort2
[Zentriert]Wort2
[Zentriert]Wort3
[Zentriert]Wort4
[Linksbuendig]Wort5
[Zentriert]Wort5

Welches der Wörter nun sein Alignment auf linksbündig änder ist bei jedem Durchlauf unterschiedlich, meistens sieht man das Wort auch nur einen Bruchteil einer Sekunde und danach ist es wieder mittig zentriert. Weiß da jemand rat ?

Hier mein Programm-Code (lyncht mich bitte nicht für eventuelle unsaubere Formatierung oder Programmierung 😉)

//############### Der bgWorker macht seinen Job ;) ####################
        private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            //Variablen deklarieren
            string text;
            string[] words;
            int initialcount = Convert.ToInt32(TB_Temp_InitialCount.Text);
            int wordscount;
            int wordlenght;
            int wordlenght2;

            //Einlesen der Datei in string text
            System.IO.StreamReader file = new System.IO.StreamReader(TB_Temp_Pfad.Text, Encoding.Default);        
            text = file.ReadToEnd();

            //Spliten der Textdatei
            words = text.Split(' ','\n');

            //Zählen der Anzahl der Elemente
            wordscount = words.Count();

            //Einstellen der Progressbar minimal und maximal Werte
            PB_Main.Minimum = 0;
            PB_Main.Maximum = wordscount;

            while (initialcount <= wordscount)
            {
                //wenn Stoptaste betaetigt wurde
                if ((bgWorker.CancellationPending == true))
                {
                    e.Cancel = true;
                    break;
                }

                //Definieren erneuerbarer Variablen
                TB_Temp_InitialCount.Text = Convert.ToString(initialcount);
                TB_Temp_TextLenght.Text = Convert.ToString(wordscount);

                //Wenn initialcount mit wordocunt uebereinstimmt
                if (initialcount == wordscount)
                {
                    //Wenn bgWorker abgebrochen wurde
                    if (bgWorker.WorkerSupportsCancellation == true)
                    {
                        bgWorker.CancelAsync();
                        BT_StartStop.Text = "Start";
                        BT_StartStop.BackColor = Color.Green;
                        BT_StartStop.Enabled = false;
                    }
                }
                //Wenn initialcount nicht mit wordcount uebereinstimmt
                else
                {               
                    //Ausgeben des aktuellen Wort indexes 
                    RTB_Main2.SelectionAlignment = HorizontalAlignment.Center;
                    RTB_Main2.Text = words[initialcount];
                    RTB_Main2.SelectionAlignment = HorizontalAlignment.Center;

                    //Einstellen des aktuellen Wertes des Progressbar
                    PB_Main.Value = initialcount;
                    PB_Main.Update();

                    //Auslesen der Wortlaenge
                    wordlenght2 = words[initialcount].Length;
                    wordlenght = wordlenght2 - 5;

                    //Wenn Wortlaenge kleiner 0
                    if (wordlenght >= 0)
                    {
                        System.Threading.Thread.Sleep(TB_Geschwindigkeit.Value + (wordlenght * 20));
                    }
                    //Wenn Wortlaenge groesser 0
                    else
                    {
                        //Wenn Geschwindigkeit - wordlenght * 20 kleiner 0
                        if (TB_Geschwindigkeit.Value - (wordlenght * 20) <= 0)
                        {
                            System.Threading.Thread.Sleep(TB_Geschwindigkeit.Value);
                        }
                        //Wenn Geschwindigkeit - wordlenght * 20 groesser 0
                        else
                        {
                            System.Threading.Thread.Sleep(TB_Geschwindigkeit.Value - (wordlenght * 20));
                        }

                    }

                    initialcount++;
                }
            }

            file.Close();
4.221 Beiträge seit 2005
vor 10 Jahren

You must be careful not to manipulate any user-interface objects in your DoWork event handler. Instead, communicate to the user interface through the BackgroundWorker events.

[FAQ] Warum blockiert mein GUI?

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

4.939 Beiträge seit 2008
vor 10 Jahren

Hallo Kreater,

CheckForIllegalCrossThreadCalls = false;  

Dies ist eindeutig die falsche Herangehensweise, um Multithreading-Programme zu schreiben.
Innerhalb der BackgroundWorker.DoWork-EventMethode darfst du nicht direkt auf GUI-Elemente zugreifen - Punkt!
Verwende entweder das BackgroundWorker.ProgressChanged-Ereignis (welches innerhalb des GUI-Threads läuft) oder aber benutze [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).

Thema geschlossen