C# 實現文本編輯器查找替換功能


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)編譯,運行.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM