在SynEdit 中实现查找和替换功能
在C++ Builder中使用 SynEdit 插件时,功能的确强大,但是常用的 查找和替换功能却不好作了,尤其没有接触过的人,太麻烦了。其实 SynEdit 自带了搜索功能,很简单,很强大!
1. 准备工作:
(1)在你设置好的界面中加入 SynEdit 控件,我的命名是 rve,当然,这是个误会,我是怕改多了程序麻烦.
(2) 加入SynEditSearch控件, 我的命名是SynEditSearch1,默认。
(3) 将 rve(synEdit) 的 SearchEngine 的改为 SynEditSearch1。
(4) 加入FindDialog控件, 命名为 FindDialog1;
(5) 加入ReplaceDialog控件,命名为ReplaceDialog1;
(6) 加入 声明 TSynSearchOptions m_sschOption;
基本上一半完成了。不过接下来的才是比较麻烦!
2. 实现:
(1) 在 FindDialog1 的OnFind事件中加入以下程序:
//-------------------------------------------------------------------------------------------------------------------------------
m_sschOption.Clear();
if ( FindDialog1->Options.Contains(frMatchCase) ) // 大小写敏感
{
m_sschOption << ssoMatchCase;
}
if ( FindDialog1->Options.Contains(frWholeWord)) // 全字符匹配
{
m_sschOption << ssoWholeWord;
}
if ( !FindDialog1->Options.Contains(frDown)) //向上搜索
{
m_sschOption << ssoBackwards;
}
//else m_sschOption << ssoFrontwards;
if ( rve->SearchReplace( FindDialog1->FindTextA, "", m_sschOption) == 0)
{
AnsiString sMessage;
sMessage.printf("Could not found /" %s /" ", FindDialog1->FindTextA );
// if could not found, show hint
Application->MessageBox(sMessage.c_str(), "Hint", MB_ICONINFORMATION);
}
//-------------------------------------------------------------------------------------------------------------------------------
(2) 在ReplaceDialog1的 OnReplace 事件中添加如下代码
//-------------------------------------------------------------------------------------------------------------------------------
m_sschOption.Clear();
if ( ReplaceDialog1->Options.Contains(frMatchCase) ) // 大小写敏感
{
m_sschOption << ssoMatchCase;
}
if ( ReplaceDialog1->Options.Contains(frWholeWord)) // 全字符匹配
{
m_sschOption << ssoWholeWord;
}
if ( !ReplaceDialog1->Options.Contains(frDown)) //向上搜索
{
m_sschOption << ssoBackwards;
}
if ( ReplaceDialog1->Options.Contains(frReplaceAll) )
{
m_sschOption << ssoReplaceAll;
}
else
{
m_sschOption << ssoReplace;
}
if ( rve->SearchReplace( ReplaceDialog1->FindTextA,
ReplaceDialog1->ReplaceTextA , m_sschOption) == 0)
{
AnsiString sMessage;
sMessage.printf("Could not found /" %s /" ", FindDialog1->FindTextA );
// if could not found, show hint
Application->MessageBox(sMessage.c_str(), "Hint", MB_ICONINFORMATION);
}
//-------------------------------------------------------------------------------------------------------------------------------
大功告成!现在运行试试看。对了,在你的按钮或者菜单的 OnClick事件中加入 FindDialog1->Execute();或者 ReplaceDialog1->Execute();
这个是我当初用到的时候作的,希望对需要的朋友有所帮助!
只为抛砖引玉,如有不妥,敬请指教!
1. 准备工作:
(1)在你设置好的界面中加入 SynEdit 控件,我的命名是 rve,当然,这是个误会,我是怕改多了程序麻烦.
(2) 加入SynEditSearch控件, 我的命名是SynEditSearch1,默认。
(3) 将 rve(synEdit) 的 SearchEngine 的改为 SynEditSearch1。
(4) 加入FindDialog控件, 命名为 FindDialog1;
(5) 加入ReplaceDialog控件,命名为ReplaceDialog1;
(6) 加入 声明 TSynSearchOptions m_sschOption;
基本上一半完成了。不过接下来的才是比较麻烦!
2. 实现:
(1) 在 FindDialog1 的OnFind事件中加入以下程序:
//-------------------------------------------------------------------------------------------------------------------------------
m_sschOption.Clear();
if ( FindDialog1->Options.Contains(frMatchCase) ) // 大小写敏感
{
m_sschOption << ssoMatchCase;
}
if ( FindDialog1->Options.Contains(frWholeWord)) // 全字符匹配
{
m_sschOption << ssoWholeWord;
}
if ( !FindDialog1->Options.Contains(frDown)) //向上搜索
{
m_sschOption << ssoBackwards;
}
//else m_sschOption << ssoFrontwards;
if ( rve->SearchReplace( FindDialog1->FindTextA, "", m_sschOption) == 0)
{
AnsiString sMessage;
sMessage.printf("Could not found /" %s /" ", FindDialog1->FindTextA );
// if could not found, show hint
Application->MessageBox(sMessage.c_str(), "Hint", MB_ICONINFORMATION);
}
//-------------------------------------------------------------------------------------------------------------------------------
(2) 在ReplaceDialog1的 OnReplace 事件中添加如下代码
//-------------------------------------------------------------------------------------------------------------------------------
m_sschOption.Clear();
if ( ReplaceDialog1->Options.Contains(frMatchCase) ) // 大小写敏感
{
m_sschOption << ssoMatchCase;
}
if ( ReplaceDialog1->Options.Contains(frWholeWord)) // 全字符匹配
{
m_sschOption << ssoWholeWord;
}
if ( !ReplaceDialog1->Options.Contains(frDown)) //向上搜索
{
m_sschOption << ssoBackwards;
}
if ( ReplaceDialog1->Options.Contains(frReplaceAll) )
{
m_sschOption << ssoReplaceAll;
}
else
{
m_sschOption << ssoReplace;
}
if ( rve->SearchReplace( ReplaceDialog1->FindTextA,
ReplaceDialog1->ReplaceTextA , m_sschOption) == 0)
{
AnsiString sMessage;
sMessage.printf("Could not found /" %s /" ", FindDialog1->FindTextA );
// if could not found, show hint
Application->MessageBox(sMessage.c_str(), "Hint", MB_ICONINFORMATION);
}
//-------------------------------------------------------------------------------------------------------------------------------
大功告成!现在运行试试看。对了,在你的按钮或者菜单的 OnClick事件中加入 FindDialog1->Execute();或者 ReplaceDialog1->Execute();
这个是我当初用到的时候作的,希望对需要的朋友有所帮助!
只为抛砖引玉,如有不妥,敬请指教!