在SynEdit 中实现查找和替换功能

来源:互联网 发布:浪子心声 歌词意境知乎 编辑:程序博客网 时间:2024/05/16 13:02
在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();
这个是我当初用到的时候作的,希望对需要的朋友有所帮助!
只为抛砖引玉,如有不妥,敬请指教!