关于SynMemo 和 SynEdit, 用过的兄弟进来帮个忙, 没有用过的来参谋参谋!! (高分)

时间:2021-05-27 04:51:39
本人在使用 SynMemo & SynEdit 的时候不知道如何实现查找和替换功能?  以前在 RichEdit里的似乎都不能用了, 难道要我把整个 内容当作字符串来处理? 也太麻烦了吧  希望熟悉的人指点一下!

4 个解决方案

#1


以前用过,因为现在机子上没装syn控件,所以工程没法打开看。
记得syn提供了一个比较简单的方法,它有一个TSynEditSearch控件。
把TSynEditSearch加到窗体上,把你的TSynEdit的SearchEngine设为刚才那个TSynEditSearch,然后加个TFindDialog来显示查找对话框。
这是我的TFindDialog的查找和查找下一个的事件函数代码,
其中m_dlgFind就是TFindDialog,m_sedtMain就是TSynEdit,m_sschOption是个TSynSearchOptions型变量,替换也是通过给TSynSearchOptions加一个属性实现的。
代码如下:

//查找
void __fastcall TfrmMain::m_dlgFindFind(TObject *Sender)
{
    m_sschOption.Clear();

    if (m_dlgFind->Options.Contains(frMatchCase))   //大小写敏感
    {
        m_sschOption << ssoMatchCase;
    }
    if (m_dlgFind->Options.Contains(frWholeWord))   //全字符匹配
    {
        m_sschOption << ssoWholeWord;
    }
    if (!m_dlgFind->Options.Contains(frDown))       //向上搜索
    {
        m_sschOption << ssoBackwards;
    }

    if (m_sedtMain->SearchReplace(m_dlgFind->FindTextA, "", m_sschOption) == 0)
    {
        AnsiString sMessage;
        sMessage.printf("找不到\"%s\"", m_dlgFind->FindTextA);

        //如果找不到,就出一个提示
        MessageBox(
            NULL,
            sMessage.c_str(),
            "提示",
            MB_ICONINFORMATION
            );
    }
}

//查找下一个
void __fastcall TfrmMain::m_miFindNextClick(TObject *Sender)
{
    //如果要搜的文本是空的,就打开查找对话框
    if (m_dlgFind->FindTextA == "")
    {
        m_miFindClick(Sender);
    }
    else
    {
        if (m_sedtMain->SearchReplace(m_dlgFind->FindTextA, "", m_sschOption) == 0)
        {
            AnsiString sMessage;
            sMessage.printf("找不到\"%s\"", m_dlgFind->FindTextA);

            //如果找不到,就出一个提示
            MessageBox(
                Handle,
                sMessage.c_str(),
                "提示",
                MB_ICONINFORMATION
                );
        }
    }
}

#2


多谢, 我下去试试看,

#3


不错, 很可惜 Syn插件没有提供 help, 很多东西不能查, 而且他的例子只能用 Delphi才能看,比较难弄,

#4


十分感谢1楼兄弟,给我指条明路,经过我自己研究,解决了替换,全部替换等问题,都很简单,我已经将完成的程序和过程发到本人 blog http://blog.csdn.net/lonelyforest, 如果那位兄弟&我一样,需要这个东西,可以去看看。有片关于 SynEdit 的查找实现。

#1


以前用过,因为现在机子上没装syn控件,所以工程没法打开看。
记得syn提供了一个比较简单的方法,它有一个TSynEditSearch控件。
把TSynEditSearch加到窗体上,把你的TSynEdit的SearchEngine设为刚才那个TSynEditSearch,然后加个TFindDialog来显示查找对话框。
这是我的TFindDialog的查找和查找下一个的事件函数代码,
其中m_dlgFind就是TFindDialog,m_sedtMain就是TSynEdit,m_sschOption是个TSynSearchOptions型变量,替换也是通过给TSynSearchOptions加一个属性实现的。
代码如下:

//查找
void __fastcall TfrmMain::m_dlgFindFind(TObject *Sender)
{
    m_sschOption.Clear();

    if (m_dlgFind->Options.Contains(frMatchCase))   //大小写敏感
    {
        m_sschOption << ssoMatchCase;
    }
    if (m_dlgFind->Options.Contains(frWholeWord))   //全字符匹配
    {
        m_sschOption << ssoWholeWord;
    }
    if (!m_dlgFind->Options.Contains(frDown))       //向上搜索
    {
        m_sschOption << ssoBackwards;
    }

    if (m_sedtMain->SearchReplace(m_dlgFind->FindTextA, "", m_sschOption) == 0)
    {
        AnsiString sMessage;
        sMessage.printf("找不到\"%s\"", m_dlgFind->FindTextA);

        //如果找不到,就出一个提示
        MessageBox(
            NULL,
            sMessage.c_str(),
            "提示",
            MB_ICONINFORMATION
            );
    }
}

//查找下一个
void __fastcall TfrmMain::m_miFindNextClick(TObject *Sender)
{
    //如果要搜的文本是空的,就打开查找对话框
    if (m_dlgFind->FindTextA == "")
    {
        m_miFindClick(Sender);
    }
    else
    {
        if (m_sedtMain->SearchReplace(m_dlgFind->FindTextA, "", m_sschOption) == 0)
        {
            AnsiString sMessage;
            sMessage.printf("找不到\"%s\"", m_dlgFind->FindTextA);

            //如果找不到,就出一个提示
            MessageBox(
                Handle,
                sMessage.c_str(),
                "提示",
                MB_ICONINFORMATION
                );
        }
    }
}

#2


多谢, 我下去试试看,

#3


不错, 很可惜 Syn插件没有提供 help, 很多东西不能查, 而且他的例子只能用 Delphi才能看,比较难弄,

#4


十分感谢1楼兄弟,给我指条明路,经过我自己研究,解决了替换,全部替换等问题,都很简单,我已经将完成的程序和过程发到本人 blog http://blog.csdn.net/lonelyforest, 如果那位兄弟&我一样,需要这个东西,可以去看看。有片关于 SynEdit 的查找实现。