RichTextBox - wyróżnianie fragmentów tekstu

0

Witam

Prosiłbym o nakierowanie jak zrobić aby w kontrolce **RichTexBox** w programie jak na obrazku, __we wszytkich rozkazach typu **MOVA** pierwszy argument był zaznaczony__/wyróżniony innym kolorem tła/wyróżniony innym kolorem czcionki itp. Chodzi o to aby wyróżniały się, w planach miałem aby było to żółte tło, czcionka bez zmian, ale to nie jest sztywny wymóg, chodzi o to aby wszystkie argumenty do których ma być dodany offset były wyróżnione.
Zaznaczenie takie jak opisałem powyżej ma się włączać w przypadku gdy w richtextbox jest cos wyswietlane, zostanie wybrana oś X do wprowadzenia offsetu oraz w kontrolce numericUpDown będzie wartość różna od zera. Jeżeli oś Y to drugi parametr rozkazu MOVA jeżeli os Z to trzeci.
Wszytkie rozkazy wyświetlone w RichTexBox to obiekty, dziedziczące po ogólnej abstakcyjnej klasie Rozkaz, różnią się tylko typem rozkazu(pierwszego slowa w linii), ilością parametrów i typem parametrów (int lub double). Wszystkie rozkazy przechowuje w List<Rozkaz> jako pole obiektu ProgramMaszyny.
Rozkazy/linie w richtextbox są wyswietlane po wywolaniu ToString() z kazdego obiektu Rozkaz.
Bezproblemowo moge pobrać pozycję startową dla każdej składowej rozkazu i długość tego parametru w linii (w jednym rozkazie) bezposrednio z obiektu tego rozkazu (tych pozycji uzywam skladając rozkaz do kupy w ToString()). Jeżeli chodzi o pozycje tych paramterów względem początku richtextbox to nie od razu ale pewnie moge to policzyc.

Zaczynałem od tego, tu chyba liczy od poczatku textu w kontrolce:
richTextBoxPodgladProgramu.SelectionBackColor = Color.Red;
richTextBoxPodgladProgramu.Select(20, 5);
richTextBoxPodgladProgramu.Select(40, 5); 

ale i tak w takim przypadku zaznaczenie pozostaje tylko z ostateniego wywolania Select. Troche szukałem, kombinowałem z właściwością Lines w RichTextBox:
w obiekcie ProgramMaszyny, jeżeli przeszukam List<Rozkaz> linie, pod katem:

 
if(linie[i] is RozkazMOVA)
    nrLiniiRozkazuMOVA.Add(i)

to namierzam linie w których są rozkazy MOVA, ale przyznam, że dalej to się zatkałem. Prosiłbym o nakierowanie, jak rozwiązać ten problem, hasla klucze co gdzie doczytac itp. bede wdzieczny za wszelkie podpowiedzi.

Poniżej poglądowy screen programu.
user image

1

Twój kod działa, pisze aplikacje która również zaznacza na kolorowo i mam dokładnie tak samo jak ty.
Jedyne co mam inne to że za każdym razem ustawiam kolor. Luknij:

private void SetColors(List<Kolorek> colors, int startInd, int length)
        {
            foreach (Kolorek k in kolorki)
            {
                OutputRTB.Select(startInd + k.index, length);
                OutputRTB.SelectionColor = k.foreC;
                OutputRTB.SelectionBackColor = k.backC;
            }
        }
0

To było to, najpierw musze coś zaznaczyć, a potem temu fragmentowi zaznaczonemu okreslam właściwosci koloru tła itp. potem zaznaczam kolejne, znow okreslam wlasciwosci tla itd. modyfikacje kolorów tła zostają, zaznaczenie w kontrolce moze być tylko jedno.

Wlasnie zabieram się za implementacje do swojego programu.

Przy okazji, czy numeracja co ma byc zaznaczone w tekscie RichTextBox jest jedna i jest prowadzona od początku całej kontrolki czy jest jakis sposób zeby okreslać co ma być zaznaczone na zasadzie nr linii, w richtextbox potem, nr znaku startu w tej linii i dlugosc zaznaczenia?

EDIT:
Dla porządku, dodaję swoje rozwiązanie:

 
        private void ZaznaczWartosciOffsetowalne(enumOs osOffsetu, double wartosc)
        {
            int kolejnyZnakWKontrolce = 0;

            int start;
            int dlugosc;

            for(int i = 0; i < progDoKorekty.PobierzIloscLinii(); i++)
            {
                if(progDoKorekty.CzyRozkazPodlegaOffsetowi(i, wartosc, osOffsetu))
                {
                    dlugosc = progDoKorekty.ZwracaDlugoscZaznaczenia(i, osOffsetu);
                    start = kolejnyZnakWKontrolce + progDoKorekty.ZwracaIndexPoczatkuZaznaczenia(i, osOffsetu) - dlugosc;

                    richTextBoxPodgladProgramu.Select(start, dlugosc);
                    richTextBoxPodgladProgramu.SelectionBackColor = Color.Yellow;
                }
                kolejnyZnakWKontrolce += progDoKorekty.PobierzLinieProgramu(i).Length -1 + 2;
            }
            richTextBoxPodgladProgramu.Select(0, 0);  

        }

Troche mi zajęło że przejście do nowej linii zajmuje 2 znaki ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1