Problem changing color of the backgronud of expressions in a richTextBox

0

I made a code to change the backColor of all richTextBox expressions that begin with an @. It's all okay, though, there is an error that I can not solve. If the first thing I write is @expressao and then I delete everything, when I start to write anything new, it already starts with the backColor changed, and should be normal, without it, not be it something starting with @.

I'm trying to see line by line where that might be the problem, but I can not seem to find it.

Follow the code:

//variável para controlar o índice dos vetores
    int ctrlAt = 0;

    //flags de controle
    Boolean flagAt = false;

    //tamanho do texto da richTextBox
    int tam = 0;

    //variável para controle dos espaços
    int last = 5000;

    //index dos espaços
    int[] spaceIndex = new int[1000];

    //index dos @
    int[] atIndex = new int[1000];

    //reseta vetor dos @
    public void atVetor()
    {
        for (int r = 0; r < 1000; r++)
        {
            atIndex[r] = -1;
        }
    }

    //reseta vetor dos espaços
    public void spaceVetor()
    {      
        for (int r = 0; r < 1000; r++)
        {
            spaceIndex[r] = -1;
        }
    }

private void richTextBox1_TextChanged(object sender, EventArgs e)
    {
        //variável com o índice atual do cursor
        int current = richTextBox1.SelectionStart;

        //string com o conteúdo do texto da richTextBox
        string text = richTextBox1.Text;

        if (text.Length < tam)
         {
            //se algum caractere foi apagado, reseta vetores e variáveis de controle
            tam = text.Length;
            atVetor();
            spaceVetor();
            ctrlAt = 0;
            richTextBox1.Select(current, 0);
            richTextBox1.SelectionColor = Color.Empty;
            richTextBox1.SelectionBackColor = Color.Empty;
        }
        else tam = text.Length;

        //percorre o texto
        for (int q = 0; q < tam; q++)
        {
            //se encontrar um @, salva seu índice no vetor
            if (text.ElementAt(q) == '@')
            {
                if (flagAt == true && q > atIndex[ctrlAt])
                {
                    //controle de dois @ sem espaço entre eles
                    if (spaceIndex[ctrlAt] != -1)
                    {
                        ctrlAt++;
                        atIndex[ctrlAt] = q;
                    }

                }

                //if específico para o primeiro @
                if (ctrlAt == 0 && atIndex[ctrlAt] == -1)
                {
                    atIndex[ctrlAt] = q;
                    flagAt = true;
                }
            }


        }

        if (atIndex[ctrlAt] != -1)
        {
            //percorre o texto
            for (int b = atIndex[ctrlAt] + 1; b < text.Length; b++)
            {
                //se achar um espaço que não seja o último encontrado, salva o seu índice no vetor
                if (text.ElementAt(b) == ' ' && spaceIndex[ctrlAt] != last)
                {
                    spaceIndex[ctrlAt] = b;
                    last = spaceIndex[ctrlAt];
                    break;
                }
            }

            //repete vezes equivalentes ao número de @'s no texto
            for (int a = 0; a <= ctrlAt; a++)
            {
                if (spaceIndex[a] != -1)
                {
                    //altera a cor do intervalo entre o @ e o espaço
                    richTextBox1.Select(atIndex[a], spaceIndex[a] - atIndex[a]);
                    richTextBox1.SelectionBackColor = Color.LightBlue;
                    richTextBox1.SelectionColor = Color.Blue;

                    //deixa tudo depois disso na cor original
                    richTextBox1.Select(current, 0);
                    richTextBox1.SelectionBackColor = Color.Empty;
                    richTextBox1.SelectionColor = Color.Empty;

                }
                else
                {
                    richTextBox1.Select(atIndex[ctrlAt], text.Length);
                    richTextBox1.SelectionBackColor = Color.Empty;
                    richTextBox1.SelectionColor = Color.Empty;
                }
            }
        }

        //faz o cursor ir para o fim do texto e não selecionar nada
        richTextBox1.Select(current, 0);

    }
    
asked by anonymous 30.01.2018 / 17:36

1 answer

0

I could not find the flagAt tag in your code.

Try changing this if , I believe you will succeed.

    if (text.Length < tam || text.Length == 0)
     {
        //se algum caractere foi apagado, reseta vetores e variáveis de controle
        tam = text.Length;
        atVetor();
        spaceVetor();
        ctrlAt = 0;
        flagAt = false;
        richTextBox1.Select(current, 0);
        richTextBox1.SelectionColor = Color.Empty;
        richTextBox1.SelectionBackColor = Color.Empty;
    }

I added the OR in IF and flagAt = false; in the middle of the code.

    
30.01.2018 / 17:51