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)编译,运行.

猜你喜欢

转载自www.cnblogs.com/liudongjun/p/12216657.html