2015-11-13 3 views
1

У меня возникли трудности с созданием кода, способного подбирать определенные слова и их цвет. настоящее время я использую этот код:Окраска программирования на основе richtextbox

private void Colorize(string word, Color color, int startIndex) 
{ 
    if (this.richTextBox1.Text.Contains(word)) 
    { 
     int index = -1; 
     int selectStart = this.richTextBox1.SelectionStart; 

     while ((index = this.richTextBox1.Text.IndexOf(word, (index + 1))) != -1) 
     { 
      this.richTextBox1.Select((index + startIndex), word.Length); 
      this.richTextBox1.SelectionColor = color; 
      this.richTextBox1.Select(selectStart, 0); 
      this.richTextBox1.SelectionFont = new Font(richTextBox1.Font, FontStyle.Regular); 
      this.richTextBox1.SelectionColor = Color.Black; 
     } 
     this.richTextBox1.SelectionColor = Color.Black; 
    } 
} 

Проблема заключается в том, что, когда текст RichTextBox слишком велик, он висит и идет сверху вниз, есть ли способ, чтобы мгновенно цвет ключевой? Я делаю базовую IDE, но мне нужны ключевые слова на основе java.

Любая ошибка извините, что я использовал переводчик Google.

+0

«зависаний» Означает ли это на самом деле висит или только что это занимает слишком много времени? Вы можете использовать 'richTextBox1.SupendLayout' и' richTextBox1.ResumeLayout', чтобы предотвратить обновление экрана до его завершения. Помимо этого вы можете попробовать изменить свойство 'richTextBox1.Rtf' напрямую с правильными кодами шрифтов и цветов, но это довольно icky .. – TaW

+0

Похоже, вы хотите реализовать подсветку синтаксиса? Если это так, вы должны использовать существующую библиотеку/решение.См. Этот вопрос для некоторых опций: http://stackoverflow.com/questions/2809545/how-to-create-syntax-highlighting-text-box. Вопрос старен, однако, с тех пор, возможно, будут более эффективные варианты. –

+0

http://stackoverflow.com/a/3282911/17034 –

ответ

0

После того, как Iv'e необходимо было реализовать C#, Python и Matlab подсветки синтаксиса, поэтому я потратил некоторое время на изучение этого.

Проблема с этим методом Select заключается в том, что сам выбор занимает много времени, так как он также грамотно выбирает текст и когда вы хотите динамически окрасить синтаксис при написании кода, существует множество вариантов, которые замедляют работу.

Попытка разобрать модификацию rtf возможна, но является настоящей головной болью и требует от вас и тех, которые будут поддерживать код после того, как вы поймете этот формат.

Хорошее решение, которое я нашел, состоит в том, что существует множество открытых источников, которые реализуют Control для выделения синтаксиса, которые вы используете.

В FastColoredTextBox, который я использовал, вы можете выбрать язык для выделения и формат, в котором вы хотите его показать, вы также можете добавить свой собственный язык в этот список и настроить его на отступ, используя Regex.

Извините, если это не тот ответ, который вы ожидали, но это то, что нужно искать, а не выполнять самостоятельно.

0

Вы знаете, что String.Contains не проверяет слова, не так ли?

Если вы используете String.Contains («умеет»), то на самом деле вы найдете слово «возможность», но вы также можете найти такие слова, как «ОТКЛ», «Соболь» и «IEquatable».

Чтобы проверить слова, вам понадобится регулярное выражение.

Всякий раз, когда вам нужно обрабатывать последовательности чего-то, LINQ - ваш друг. Подумайте о том, чтобы ознакомиться с возможностями LINQ.

Introduction of LINQ

Использование регулярных выражений и LINQ я мог раскрасить полное собрание сочинений Шекспира (более пяти миллионов символов) примерно 5 секунд

// on load form: fill the rich text box with 
// the complete works of William Shakespeare 
private async void Form1_Load(object sender, EventArgs e) 
{ 
    const string completeShakespeare = "http://www.gutenberg.org/cache/epub/100/pg100.txt"; 
    using (var downloader = new HttpClient()) 
    { 
     this.richTextBox1.Text = await downloader.GetStringAsync (completeShakespeare); 
    } 
} 

// on button click: mark all "thee" red 
private void button1_Click(object sender, EventArgs e) 
{ 
    var stopwatch = Stopwatch.StartNew(); 
    this.Colorize2("thee", Color.Red); 
    var elapsed = stopwatch.Elapsed; 
    Debug.WriteLine ("Coloring a text with {0} characters took {1:F3} sec", 
     this.richTextBox1.Text.Length, 
     elapsed.TotalSeconds); 
} 

private void Colorize2(string word, Color color) 
{ 
    string regString = String.Format(@"\b{0}\b", word); 
    // regex: match substring that match word, 
    // with boundaries to non alphanumeric characters like space and \n \r \t 

    var regex = new Regex(regString, RegexOptions.IgnoreCase); 
    var matches = regex.Matches(richTextBox1.Text); 
    foreach (Match match in matches.Cast<Match>()) 
    { 
     this.richTextBox1.Select(match.Index, match.Length); 
     this.richTextBox1.SelectionColor = color; 
    } 
} 
Смежные вопросы