4.6 實現文本編輯器查找替換功能
本節首先介紹模式對話框和非模式對話框的概念。 並用非模式對話框實現文本編輯器程
序的查找和替換功能。
4.6.1 模式對話框和非模式對話框
模式對話框和非模式對話框的區別是:打開模式對話框后,只有關閉該模式對話框, 才
能轉到其他窗口, 例如前邊講到的 SaveDialog 和 OpenDialog 都是典型的模式對話框。 而打
開非模式對話框后, 不必退出該模式對話框, 就可以轉到其他窗口, 例如查找和替換對話框
都是典型的非模式對話框。兩類對話框本質上都是窗體,是 System.Windows.Forms.Form
類的派生類,只是打開時使用的方法不一樣,打開模式對話框,使用方法 ShowDialog() ,
而打開非模式對話框,使用方法 Show()。文本編輯器程序中,查找和替換對話框一般是非
模式對話框。
4.6.2 寫字板查找替換功能的實現
(20)建立查找替換對話框。對話框其實就是窗體,其基類是 System.Windows.Forms.Form 。
選擇菜單項項目 / 添加 Windows窗體,彈出對話框 ,選擇 Windows窗體,在名稱欄輸入窗體文件名稱:
formFindReplace.cs ,單擊打開按鈕,可以見到一個新窗體。其屬性 Name=formFindReplace。
(21)修改 formFindReplace 窗體屬性 StartPosition=CenterParent ,表示打開對話框時,對
話框在父窗口的中間。 修改屬性 MaximizeBox=False, MinimizeBox=False , 表示沒有最
大化和最小化按鈕,既不能最大化和最小化。 FormBorderStyle=FixedDialog ,窗口不
能修改大小。 屬性 Text=" 查找和替換 "。 在窗體中增加兩個 Label 控件,屬性 Text 分別
為"查找字符串 "和"替換字符串 "。兩個 TextBox 控件,屬性 Text="" 。兩個按鈕,屬性
Text 分別為 "查找下一個 "和"替換查到字符 "。修改屬性 TopMost=true ,使該窗口打開
時總在其它窗體的前邊.
(22)為 formFindReplace 窗體增加變量:Form1 MainForm1;
(23)修改 formFindReplace 類構造函數如下 ( 綠色部分是所做的修改 ):
public formFindReplace(Form1 form1)// 增加參數
{
InitializeComponent();//TODO:在InitializeComponent 調用后添加任何構造函數代碼
MainForm1=form1;// 新增語句 , 這里Form1是主窗體的屬性 Name 的值
}// 有了 Form1,可以在 formFindReplace 窗體中調用主窗體的公有方法
(24)為主窗體 Form1 增加方法如下,該方法將被 formFindReplace 窗體類調用。
public void FindRichTextBoxString( string FindString)
{} //以后步驟將在此方法中增加查找語句
(25)formFindReplace 窗體中查找下一個按鈕單擊事件處理函數如下:
private void buttonFind_Click( object sender, System.EventArgs e)
{
if (textBox1.Text.Length!=0)// 如果查找字符串不為空 , 調用主窗體查找方法
MainForm1.FindRichTextBoxString(textBox1.Text);// 上步增加的方法
else
MessageBox.Show("查找字符串不能為空 "," 提示",MessageBoxButtons.OK);
}
(26)為主窗體 Form1 增加方法如下,該方法將被 formFindReplace 窗體類調用。
public void ReplaceRichTextBoxString( string ReplaceString)
{} // 以后步驟將在此方法中增加替換語句
(27)為替換查到字符按鈕單擊事件增加事件處理函數如下:
private void buttonReplace_Click( object sender, System.EventArgs e)
{
if (textBox2.Text.Length!=0)// 如果替換字符串不為空 , 調用主窗體替換方法
MainForm1.ReplaceRichTextBoxString(textBox2.Text);
else // 方法MainForm1.ReplaceRichTextBoxString 見(26) 中定義
MessageBox.Show("替換字符串不能為空 "," 提示", MessageBoxButtons.OK);
}
(28)為 Form1 窗體增加變量: int FindPostion=0;記錄查找位置。
(29)為 Form1 窗體頂級菜單項編輯的彈出菜單增加菜單項: 查找和替換。 為查找和替換菜單
項單擊事件增加事件處理函數如下:
private void menuItemFindReplace_Click( object sender, System.EventArgs e)
{
FindPostion=0;
formFindReplace FindReplaceDialog= new formFindReplace(this);// 注意this
FindReplaceDialog.Show();// 打開非模式對話框使用 Show()方法
}
(30)為在前邊定義的 Form1 主窗體的 FindRichTextBoxString 方法增加語句如下:
public void FindRichTextBoxString(string FindString)
{
if (FindPostion>=richTextBox1.Text.Length)// 已查到文本底部
{
MessageBox.Show("已到文本底部 , 再次查找將從文本開始處查找 ","提示",MessageBoxButtons.OK);
FindPostion=0;
return ;
}// 下邊語句進行查找, 返回找到的位置,返回 -1, 表示未找到,參數 1是要找的字符串
// 參數2是查找的開始位置, 參數3是查找的一些選項, 如大小寫是否匹配, 查找方向等
FindPostion=richTextBox1.Find(FindString,FindPostion,RichTextBoxFinds.MatchCase);
if (FindPostion==-1)// 如果未找到
{
MessageBox.Show("已到文本底部 , 再次查找將從文本開始處查找 ","提示", MessageBoxButtons.OK);
FindPostion=0;// 下次查找的開始位置
}
else// 已找到
{
richTextBox1.Focus();// 主窗體成為注視窗口
FindPostion+=FindString.Length;
}// 下次查找的開始位置在此次找到字符串之后
}
(31)為在前邊定義的 Form1 主窗體的 ReplaceRichTextBoxString 方法增加語句如下:
public void ReplaceRichTextBoxString( string ReplaceString)
{
if (richTextBox1.SelectedText.Length!=0)// 如果選取了字符串
richTextBox1.SelectedText=ReplaceString;// 替換被選的字符串
}
(32)編譯,運行.