2012年12月29日 星期六

c# 如何實作FindTextDialog

(下載範例)

從整篇文字裡面查找某一個指定字串是文字編輯器的基本功能,在Windows系統裡面FindTextDialog常常也被視為基本的通用對話盒而由系統或SDK所提供。但在.NET裡的Toolbox裡面沒有提供這樣的元件,底下以最容易的方式實作了一個FindTextDlg所必備的最基本功能。包含:

  • 基本的從文本搜尋指定字串(Find Text)
  • 往上或往下查找(Foreward or Backward)
  • 查找符合大小寫的字串(Match Case)
  • 查找符合完整字串(Match Whole Word)
首先第一步,建立一個用來作為FindTextDlg的Form,這是按照如上所列出可以滿足一般的需求功能而建立的一個Form,如下所示。


FindTextDlg顯示的方式是以Modaless的形式顯示出來的,所以可以在FindTextDlg出現時同時又切換Focus到其它地方繼續其它操作。依照慣例,當使用者按下Ctrl+F時,FindTextDlg會顯示出來。或者當使用者按下F3時,會繼續從當前位置繼續往下(或往上)杳找指定字串。假如當使用者按下F3時FindTextDlg是Hide的狀態的話,那它的執行動作就相當於按下Ctrl+F。

許多編輯器支援可以開啟多個文件作編輯,這時候FindTextDlg也可以只需要一個Instance。考慮到這點,FindTextDlg可以實作作Singleton型式。當然,是否如此實作需視實際實求。


private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
  if (e.Control && e.KeyCode == Keys.F)
    FindTextDlg.ShowFindTextDlg();
  else if (e.KeyCode == Keys.F3)
    FindTextDlg.Search();
}

如上,當在文字編輯器裡按下Ctrl+F或F3時,分別呼叫FindTextDlg的ShowFindTextDlg或Search。


static FindTextDlg Instance = null;

static public void ShowFindTextDlg()
{
  if (null == Instance)
    Instance = new FindTextDlg();

  Instance.Show();
  Instance.cbFindStr.SelectAll();
  Instance.cbFindStr.Focus();
}

static public void Search()
{
  if (null == Instance)
  {
    ShowFindTextDlg();
    return;
  }
}

接下來的重點就是如何實作Search的功能。

基本的查找功能,我們可以由String.IndexOf(string value)得到。如果加上要由當得或指定文件位置開始查找則可以由String.IndexOf(string value, int startIndex)得到。如果要再加上是否檢查大小寫則可以由String.IndexOf(string value, StringComparison comparisonType)得到。至於要往前查找,則只需要使用對應的String.LastIndexOf版本即可。

其它細節可參考範例程式

Related Posts Plugin for WordPress, Blogger...