Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск в TRichEdit, использование TFindDialog 
:(
    Опции темы
Anour
Дата 7.9.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 4.9.2008

Репутация: нет
Всего: нет



Код

 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;
    }



Вот код для поиска.... но в нем есть один существенный недостаток - модификатор направления поиска не работает... (поиск только сверху-вниз)... Помогите доработать
PM MAIL   Вверх
XPyCT
Дата 9.9.2008, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 24.8.2007
Где: Moldova

Репутация: 10
Всего: 10



может это вам поможет! я выкладывал пример рич едита!
http://forum.vingrad.ru/forum/s/1f22829dda...ml#st_15_view_0
PM MAIL Skype   Вверх
Anour
Дата 9.9.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 4.9.2008

Репутация: нет
Всего: нет



Увы, в твоем примере также не учитывается направление поиска
PM MAIL   Вверх
volvo877
Дата 10.9.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 13
Всего: 116



Цитата(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();
}

PM MAIL   Вверх
Anour
Дата 10.9.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 4.9.2008

Репутация: нет
Всего: нет



Направление "вверх" работает, а "вниз" теперь нет... позиция не меняется
PM MAIL   Вверх
volvo877
Дата 10.9.2008, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 13
Всего: 116



Неправда... Тестировалось и на RichEdit-е, и на Memo, и там и там работает как положено (Builder 2007)... Значит, вызываешь не так, как нужно. Присоединяй тестовый проект.
PM MAIL   Вверх
Anour
Дата 11.9.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 4.9.2008

Репутация: нет
Всего: нет



Я на BCB 6 компилирую... Вот элементарный пример с этим кодом... 

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Search.rar 3,56 Kb
PM MAIL   Вверх
volvo877
Дата 11.9.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 13
Всего: 116



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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0779 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.