[C#] Problem z RTF-em


(Himek22) #1

Witam!

Próbuję napisać w C# (Windows Forms) prosty edytor XML-a. Jedynymi kontrolkami są richTextBox i Timer. Program ma za zadanie pogrubiać każdy znacznik (od "<" do ">"). W zdarzeniu Timer.Tick po sprawdzeniu, czy ilość "<" i ">" jest taka sama, program zamienia każdy "<" w zawartości (.Text) richTextBox-a na "{\b<", każdy ">" na ">}" oraz dodaje "{\rtf" na początku i "}" na końcu. Tak zmodyfikowany tekst jest przypisywany właściwości .rtf richTextBox-a. Początkowo działa dobrze. Gdy napiszę np. znacznik jest pogrubiany, ale gdy dopiszę jeszcze coś, dopisany tekst również jest pogrubiany. Sprawdziłem generowanego RTF-a. Wygląda tak:

{\rtf {\b }yyy}

Kod zdarzenia:

string t = mainTB.Text; //mainTB to ten RichTextBox//

            int c1 = t.Count(f => f == '<');

            int c2 = t.Count(f => f == '>');

            if (c1 == c2)

            {

                int lastPosition = mainTB.SelectionStart; 

                t = t.Replace("<", "{\\b <");

                t = t.Replace(">", ">}");

                t = "{\\rtf " + t + "}";

                mainTB.Rtf = t;

                mainTB.SelectionStart = lastPosition;

                Console.WriteLine(t); //Stąd skopiowałem RTF-a//

            }

Co robię źle? :frowning: Program powinien pogrubiać tylko od "<" do ">".

Nie jestem profesjonalnym programistą, pierwszy raz próbuję użyć RTF-a w programie. Dlatego proszę o wyrozumiałość w sprawie tego prostego pytania pytania. :frowning:

(Visual C# Express 2010, .NET Framework 4, Windows 7)


(B.Andy) #2

Użycie Timera to niezbyt dobre rozwiązanie… Zapewne problem tkwi w warunku if (c1 == c2). Przypuszczalnie masz jakiś znacznik, w trakcie pisania liczba otwierających != liczbie zamykających i program nie koloruje, a jeśli właśnie kursor jest za znakiem >, Richtextbox automatem będzie “pisał” pogrubioną czcionką (czego program nie poprawi dopóki liczba znaków < nie będzie równa >).


(Himek22) #3

Dziękuję za pomoc. Przemyślę jeszcze raz całość i spróbuję zrobić to nie-timerowo. :smiley:


(somekind) #4

Przede wszystkim Timer nie jest Ci do niczego potrzebny, wystarczy Ci obsługa zdarzenia TextChanged. A ponadto, nie ma sensu ręcznie formatować tagów RTF, skoro kontrolka RichTextBox pozwala na dość zaawansowaną edycję swojej zawartości.

private void richTextBox1_TextChanged(object sender, EventArgs e)

{

    RichTextBox rtb = this.richTextBox1;


    int previousPosition = rtb.SelectionStart;

    string text = rtb.Text;


    for (int i = 0; i < text.Length; i++)

    {

        if (text[i] == '<')

        {

            int end = text.IndexOf('>', i);

            if (end > 0)

            {

                rtb.Select(i, end - i + 1);

                rtb.SelectionFont = new Font(rtb.SelectionFont, FontStyle.Bold);

            }

        }

    }


    rtb.SelectionStart = previousPosition;

    rtb.SelectionLength = 0;

    rtb.SelectionFont = new Font(rtb.SelectionFont, FontStyle.Regular);

}