2015-11-13 85 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的關鍵字。

任何錯誤抱歉我使用谷歌翻譯。

+0

是「掛」上色莎士比亞(超過五百萬個字符)的全集意味着它真正掛起或只知道它需要很長時間?您可能想使用'richTextBox1.SupendLayout'和'richTextBox1.ResumeLayout'來防止屏幕更新,直到完成。除此之外,您可以嘗試直接使用正確的字體和顏色表代碼來修改'richTextBox1.Rtf'屬性,但這相當噁心。 – 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#PythonMatlab語法突出顯示,所以我花了一些時間研究它。

RichTextBox這個Select方法的問題是,選擇本身需要一定的時間,因爲它也grafically選擇文本,當你想dinamically顏色的語法時,代碼編寫有很多選擇,這使得它緩慢。

試圖解析修改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; 
    } 
}