Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > поиск в TRichEdit


Автор: Anour 7.9.2008, 13:08
Код

 TSearchTypes st;
    TFindDialog *cd;
    int newpos;

    if ((cd = dynamic_cast<TFindDialog *> (Sender)) == 0)
        MessageBox(NULL, "Dynamic Cast Failed!", "Find/Rep", MB_OK);

    if (cd->Options.Contains(frMatchCase))
        st << stMatchCase;
    if (cd->Options.Contains(frWholeWord))
        st << stWholeWord;

    if (RichEdit1->SelLength)
        RichEdit1->SelStart += 1;

    newpos = RichEdit1->FindText(cd->FindText,
                        RichEdit1->SelStart,
                        RichEdit1->Text.Length(),
                        st);

    if (newpos != -1)
    {
        RichEdit1->SelStart = newpos;
        RichEdit1->SelLength = cd->FindText.Length();
    }
    else
    {
        MessageBox(NULL, "End of document reached.", "Find/Rep", MB_OK);
        RichEdit1->SelStart = 0;
    }



Вот код для поиска.... но в нем есть один существенный недостаток - модификатор направления поиска не работает... (поиск только сверху-вниз)... Помогите доработать

Автор: XPyCT 9.9.2008, 09:05
может это вам поможет! я выкладывал пример рич едита!
http://forum.vingrad.ru/forum/s/1f22829dda30b201ee2c2e50e6560b75/topic-218224.html#st_15_view_0

Автор: Anour 9.9.2008, 17:12
Увы, в твоем примере также не учитывается направление поиска

Автор: volvo877 10.9.2008, 21:32
Цитата(Anour @  7.9.2008,  13:08 Найти цитируемый пост)
Помогите доработать 
Тестируй:

Код

AnsiString __fastcall InvertString(AnsiString Str)
{
    char *Convert = new char[Str.Length() + 1];
    int ConvertCnt = 0;
    for(int i = Str.Length() - 1; i >= 0; i--) {
        Convert[ConvertCnt++] = Str.c_str()[i];
    }
    Convert[Str.Length()] = 0;
    AnsiString ReturnStr = Convert;
    delete Convert;

    return ReturnStr;
}

void __fastcall TForm1::FindDialog1Find(TObject *Sender)
{
    TFindDialog *Dialog = dynamic_cast<TFindDialog *>(Sender);
    TCustomEdit *text_box = RichEdit1; // любой Edit / RichEdit

    AnsiString FindStr, ToFindStr;
    if (Dialog->Options.Contains(frDown)) {
        text_box->SelStart = text_box->SelStart + text_box->SelLength;
        text_box->SelLength = 0;
        FindStr = text_box->Text.SubString(
            text_box->SelStart,
            text_box->Text.Length() - text_box->SelStart
        );
        ToFindStr = FindDialog1->FindText;
    }
    else {
        FindStr = InvertString(text_box->Text.SubString(0, text_box->SelStart));
        ToFindStr = InvertString(FindDialog1->FindText);
    }

    if (!Dialog->Options.Contains(frMatchCase)) {
        FindStr = FindStr.LowerCase();
        ToFindStr = ToFindStr.LowerCase();
    }

    int FindPos, OldSelStart = text_box->SelStart;
    while (1) {
        FindPos = FindStr.Pos(ToFindStr);
        if (FindPos == 0) {
            ShowMessage("Больше ничего нет :)"); return;
        }
        if (Dialog->Options.Contains(frWholeWord)) {
            if (
                (FindPos == 0 || !isalnum(FindStr.c_str()[FindPos-2])) &&
                (FindPos == FindStr.Length() - ToFindStr.Length() - 1 ||
                !isalnum(FindStr.c_str()[FindPos-1+ToFindStr.Length()]))
            ) break;
            FindStr = FindStr.SubString(FindPos+1, FindStr.Length() - FindPos);
        }
        else {
            break;
        }
    }

    if (Dialog->Options.Contains(frDown)) {
        if(OldSelStart == 0) {
            OldSelStart++;
        }
        text_box->SelStart = OldSelStart + FindPos - 2;
    }
    else {
        text_box->SelStart = OldSelStart - FindPos - ToFindStr.Length() + 1;
    }

    text_box->SelLength = ToFindStr.Length();
    text_box->SetFocus();
}

Автор: Anour 10.9.2008, 21:56
Направление "вверх" работает, а "вниз" теперь нет... позиция не меняется

Автор: volvo877 10.9.2008, 22:27
Неправда... Тестировалось и на RichEdit-е, и на Memo, и там и там работает как положено (Builder 2007)... Значит, вызываешь не так, как нужно. Присоединяй тестовый проект.

Автор: Anour 11.9.2008, 14:48
Я на BCB 6 компилирую... Вот элементарный пример с этим кодом... 

Автор: volvo877 11.9.2008, 16:52
Цитата(Anour @  11.9.2008,  14:48 Найти цитируемый пост)
Я на BCB 6 компилирую...
С этим ничем помочь не могу, BCB6 у меня нет... В том, что под 2007 все работает, можешь убедиться: http://filekeeper.org/download/volvo877/searching.avi лежит ролик размером 1.1Мб, показывающий процесс поиска...  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)