none
Destacar Diferenças entre RichTextBox RRS feed

  • Pergunta

  • Entre duas RichTextBox, como posso destacar (mudar a cor) automaticamente dos textos com diferença. 

    Gostaria de fazer comparações entre hexadecimais destacando os diferentes.

    Ex.: 

    Texto 1: 558BEC8

    Texto 2: 448BEC8

    Seria mais ou menos parecido com o código a baixo, mas no lugar de mudar a cor do texto selecionado, que muda-se dos caracteres diferentes:

     RichTextBox2.SelectionLength = RichTextBox1.SelectedText.Length
    RichTextBox2.SelectionStart = RichTextBox1.SelectionStart
    RichTextBox2.SelectionColor = Color.Red

    quinta-feira, 11 de junho de 2015 16:47

Respostas

  • Cara, entendi seu problema agora relendo sua thread. 

    Você consegue fazer isso que você está querendo utilizando um RichTextBox. Eu procurei um pouco a respeito de como fazer o que você está precisando e achei um exemplo nessa thread do stackoverflow. Basicamente você vai precisar de uma biblioteca chamada diff-match-patch, que tem link para download no próprio post de resposta da thread que estou linkando. Vai haver uma classe chamada DiffMatchPatch.cs que você deve incluir em seu projeto. Depois, o código abaixo deveria fazer o que você precisa, de exibir somente os textos diferentes comparando-se duas RichTextBoxes. O código está em C#, então não sei se é possível fazer em VB.NET.

    using DiffMatchPatch;
    
    namespace RTF_diff
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
            InitializeComponent();
        }
    
        // this is the diff object;
        diff_match_patch DIFF = new diff_match_patch();
    
        // these are the diffs
        List<Diff> diffs;
    
        // chunks for formatting the two RTBs:
        List<Chunk> chunklist1; 
        List<Chunk> chunklist2;
    
        // two color lists:
        Color[] colors1 = new Color[3] { Color.LightGreen, Color.LightSalmon, Color.White, };
        Color[] colors2 = new Color[3] { Color.LightSalmon, Color.LightGreen, Color.White };
    
    
        public struct Chunk
        {
            public int startpos;
            public int length;
            public Color BackColor;
        }
    
    
        private void button1_Click(object sender, EventArgs e)
        {
    
            diffs = DIFF.diff_main(RTB1.Text, RTB2.Text);
            DIFF.diff_cleanupSemanticLossless(diffs);      // <--- see note !
    
            chunklist1 = collectChunks(RTB1);
            chunklist2 = collectChunks(RTB2);
    
            paintChunks(RTB1, chunklist1);
            paintChunks(RTB2, chunklist2);
    
            RTB1.SelectionLength = 0;
            RTB2.SelectionLength = 0;
    
        }
    
    
        List<Chunk> collectChunks(RichTextBox RTB)
        {
            RTB.Text = "";
            List<Chunk> chunkList = new List<Chunk>();
            foreach (Diff d in diffs)
            {
                if (RTB == RTB2 && d.operation == Operation.DELETE) continue;  // **
                if (RTB == RTB1 && d.operation == Operation.INSERT) continue;  // **
    
                Chunk ch = new Chunk();
                int length = RTB.TextLength;
                RTB.AppendText(d.text);
                ch.startpos = length;
                ch.length = d.text.Length;
                ch.BackColor = RTB == RTB1 ? colors1[(int)d.operation]: colors2[(int)d.operation];
                chunkList.Add(ch);
            }
            return chunkList;
    
        }
    
        void paintChunks(RichTextBox RTB, List<Chunk> theChunks)
        {
            foreach (Chunk ch in theChunks)
            {
                RTB.Select(ch.startpos, ch.length);
                RTB.SelectionBackColor = ch.BackColor;
            }
    
        }
    
      }
    }

    Espero que isso possa lhe ajudar.

    Scuesso!

    segunda-feira, 15 de junho de 2015 17:07

Todas as Respostas

  • Você quer mudar a cor do texto dentro dos TextBoxes? Não entendi seu problema...
    sexta-feira, 12 de junho de 2015 18:40
  • Cara, entendi seu problema agora relendo sua thread. 

    Você consegue fazer isso que você está querendo utilizando um RichTextBox. Eu procurei um pouco a respeito de como fazer o que você está precisando e achei um exemplo nessa thread do stackoverflow. Basicamente você vai precisar de uma biblioteca chamada diff-match-patch, que tem link para download no próprio post de resposta da thread que estou linkando. Vai haver uma classe chamada DiffMatchPatch.cs que você deve incluir em seu projeto. Depois, o código abaixo deveria fazer o que você precisa, de exibir somente os textos diferentes comparando-se duas RichTextBoxes. O código está em C#, então não sei se é possível fazer em VB.NET.

    using DiffMatchPatch;
    
    namespace RTF_diff
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
            InitializeComponent();
        }
    
        // this is the diff object;
        diff_match_patch DIFF = new diff_match_patch();
    
        // these are the diffs
        List<Diff> diffs;
    
        // chunks for formatting the two RTBs:
        List<Chunk> chunklist1; 
        List<Chunk> chunklist2;
    
        // two color lists:
        Color[] colors1 = new Color[3] { Color.LightGreen, Color.LightSalmon, Color.White, };
        Color[] colors2 = new Color[3] { Color.LightSalmon, Color.LightGreen, Color.White };
    
    
        public struct Chunk
        {
            public int startpos;
            public int length;
            public Color BackColor;
        }
    
    
        private void button1_Click(object sender, EventArgs e)
        {
    
            diffs = DIFF.diff_main(RTB1.Text, RTB2.Text);
            DIFF.diff_cleanupSemanticLossless(diffs);      // <--- see note !
    
            chunklist1 = collectChunks(RTB1);
            chunklist2 = collectChunks(RTB2);
    
            paintChunks(RTB1, chunklist1);
            paintChunks(RTB2, chunklist2);
    
            RTB1.SelectionLength = 0;
            RTB2.SelectionLength = 0;
    
        }
    
    
        List<Chunk> collectChunks(RichTextBox RTB)
        {
            RTB.Text = "";
            List<Chunk> chunkList = new List<Chunk>();
            foreach (Diff d in diffs)
            {
                if (RTB == RTB2 && d.operation == Operation.DELETE) continue;  // **
                if (RTB == RTB1 && d.operation == Operation.INSERT) continue;  // **
    
                Chunk ch = new Chunk();
                int length = RTB.TextLength;
                RTB.AppendText(d.text);
                ch.startpos = length;
                ch.length = d.text.Length;
                ch.BackColor = RTB == RTB1 ? colors1[(int)d.operation]: colors2[(int)d.operation];
                chunkList.Add(ch);
            }
            return chunkList;
    
        }
    
        void paintChunks(RichTextBox RTB, List<Chunk> theChunks)
        {
            foreach (Chunk ch in theChunks)
            {
                RTB.Select(ch.startpos, ch.length);
                RTB.SelectionBackColor = ch.BackColor;
            }
    
        }
    
      }
    }

    Espero que isso possa lhe ajudar.

    Scuesso!

    segunda-feira, 15 de junho de 2015 17:07