Problem when changing backgronud color of expressions of a richTextBox

Asked

Viewed 32 times

0

I made a code to change the backcolor of all richTextBox expressions starting with a @. It’s all ok, however, there is an error that I’m not able to solve. If the first thing I write is @expression and then I delete everything, when I start writing something again, it starts with the backcolor changed, and it should be normal, without it, unless it was something starting with @.

I’m trying to see line by line where the problem might be, but I can’t find.

Follows 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);

    }

1 answer

0

I couldn’t find the "off" mark flagAt in your code.

Try to change this if, want 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 the IF and flagAt = false; in the middle of the code.

  • I applied those amendments, but it did not resolve them. And I believe that the flag has nothing to do with it, because it controls the location of the @ in the array, and the colored background is getting into anything I type after deleting, with or without @’s.

  • I advise you to debug the code to understand why it is coming to the line of code: richTextBox1.Select(atIndex[a], spaceIndex[a] - atIndex[a]); Instead of going into Else, that cleans the background.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.