Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в ЛистБоксе 
:(
    Опции темы
mr.Anderson
Дата 21.9.2005, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Задача: надо найти введенную юзверем строчку в ListBox1, затем выделить в нем эту строчку (ну, и соответственно прокрутить список до этой самой строчки). Как это сделать, подскажьте...


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
_hunter
Дата 21.9.2005, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



в цикде пробегаеш все Items и сверяеш Items[i] с введенной строчкой
выделение ItemIndex = i;
прокрутка -- TopIndex = i;


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
rsm
Дата 21.9.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно так же воспользоваться встроенным в ListBox поиском элемента:
Код

int i = ListBox1->Items->IndexOf("SomeString");
if(i >= 0)
{
    ListBox1->ItemIndex = i;
    ListBox1->TopIndex = i;
}

PM MAIL   Вверх
mr.Anderson
Дата 21.9.2005, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Написал (по hunter'у):
Код

int i;
 for(i=0;i<=ListBox1->Items->Count;++i)
 {
  if(Form6->Edit1->Text==ListBox1->Items[i])
  {
   MessageBox(NULL,"Есть совпадения!","Инфо",MB_ICONINFORMATION);
   ListBox1->ItemIndex=i;
   ListBox1->TopIndex=i;
   return;
  }
 }
 MessageBox(NULL,"Нет совпадений!","Инфо",MB_ICONINFORMATION);

Гм. Однако, ошибка в строчке номер 4 о несовместимости типов.

rsm, ваш вариант опробую.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
_hunter
Дата 21.9.2005, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



а... ну да: ListBox1->Items->Strings[i]
( писал из головы )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
mr.Anderson
Дата 21.9.2005, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Гм. rsm, проблема. IndexOf ищет, похоже, точное совпадение введенной строки с Итемом у ЛистБокса. А надо, чтобы искалась и подстрока в том числе.
hunter, а ваш код тож строку целиком ищет, или и подстроку может искать?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
rsm
Дата 21.9.2005, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Чтобы подстроку искать нужно примерно такой код писать:
Код

AnsiString szItem;
int i;

i = ListBox1->Items->Count;
while(i--)
{
    szItem = ListBox1->Items->Strings[i];
    if(szItem.Pos("SomeString"))
    {
        ShowMessage("Found! :)");
        ListBox1->ItemIndex = i;
        ListBox1->TopIndex = i;
        break;
    }
}

А чтобы сделать поиск еще и регистронезависимым, нужно сделать замену:
Код

    szItem = ListBox1->Items->Strings[i];
    // заменить на
    szItem = AnsiLowerCase(ListBox1->Items->Strings[i]);

И после этого искать подстроку, так же приведенную в нижний регистр:
Код

    if(szItem.Pos("somestring"))


Это сообщение отредактировал(а) rsm - 21.9.2005, 20:41
PM MAIL   Вверх
rsm
Дата 21.9.2005, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну и в качестве логичного завершения можно написать целую функцию:
Код

/*
     int ListBox_FindString(TListBox *ListBox, AnsiString szString, bool fIgnoreCase)

     Описание: 
           Выполняет поиск подстроки во всех строках контрола класса ListBox.

     Аргументы:
           ListBox - указатель на контрол, в котором производится поиск;
           szString - искомая подстрока;
           fIgnoreCase - флаг игнорирования разности регистра символов;

     Возвращаемое значение:
           а) индекс искомой подстроки, если она успешно найдена;
           б) -1 в случае, если искомая подстрока не найдена;
*/

int ListBox_FindString(TListBox *ListBox, AnsiString szString, bool fIgnoreCase)
{
    AnsiString szItem;
    int i;

    if(fIgnoreCase)
        szString = szString.LowerCase();
    i = ListBox->Items->Count;
    while(i--)
    {
        szItem = ListBox->Items->Strings[i];
        if(fIgnoreCase)
            szItem = szItem.LowerCase();
        if(szItem.Pos(szString))
            return i;
    }
    return -1;
}


Применение:
Код

    // чувствительность к регистру отключена
    if(ListBox_FindString(ListBox1, "SoMeStRiNg", true) >= 0)
        ShowMessage("Found! :)");
    else
        ShowMessage("Not found! :(");

    // чувствительность к регистру включена
    if(ListBox_FindString(ListBox1, "SomeString", false) >= 0)
        ShowMessage("Found! :)");
    else
        ShowMessage("Not found! :(");


Это сообщение отредактировал(а) rsm - 21.9.2005, 21:20
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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