Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > LB_FINDSTRING


Автор: madbizarre 26.10.2010, 22:09
Копирую в szBuf содержимое Edit1 с дефайном POISK, вроде ка вычитал LB_FINDSTRING должен возвращать номер искомой строки, но у меня почемуто всегда id=-1  в чем ошибка?
Код

            GetDlgItemText(hDlg,POISK,szBuf,30);
            int id=SendMessage(hList,LB_FINDSTRING,0,(LPARAM)szBuf);
            ListView_SetItemState(hList, id, LVIS_SELECTED,  LVIS_SELECTED);

Автор: Earnest 27.10.2010, 07:12
Так у тебя лист-вью или лист-бокс? Это таки две большие разницы.
LB_FINDSTRING - дли лист-бокса,  ListView_SetItemState - для лист-вью.
Искать строку в лист вью нужно ручками.

Автор: madbizarre 27.10.2010, 17:55
Неподскажешь примерный вид куска текста? Ато алгоритм то я понимаю в целом, а вот вин апи плохо знаю.

Автор: BorisVorontsov 27.10.2010, 18:28
Цитата(Earnest @  27.10.2010,  07:12 Найти цитируемый пост)
Искать строку в лист вью нужно ручками. 

Глупости, посредством ListView_FindItem

Автор: madbizarre 28.10.2010, 12:37
А можно подробное описание этого макроса? Какие параметры и что возвращает?

Автор: BorisVorontsov 28.10.2010, 13:09
Описание, как ни странно, здесь: http://msdn.microsoft.com/en-us/library/bb761242.aspx
Принимает стартовый индекс и параметры для поиска, а возвращает либо индекс пункта при успешном поиске, либо -1 при неудачном
Для того, что бы выполнить поиск по строке, необходимо указать флаг LVFI_STRING и проинициализировать psz строкой для поиска

Автор: madbizarre 28.10.2010, 18:06
Код

LVFINDINFO lpl;

            GetDlgItemText(hDlg,POISK,szBuf,30);
            lpl.flags=LVFI_STRING; 
            lpl.psz=szBuf;
            int id=ListView_FindItem(hList,0,lpl.psz);
            ListView_SetItemState(hList, id, LVIS_SELECTED,  LVIS_SELECTED);

Вроде как ты и сказал, а значение всё равно -1

Автор: BorisVorontsov 28.10.2010, 19:00
Скорее всего, строка не совпадает полностью с текстом пункта.
Цитата(MSDN)

Searches based on the item text. Unless additional values are specified, the item text of the matching item must exactly match the string pointed to by the psz member. 

Для поиска по началу строки необходимо задать флаг LVFI_PARTIAL, о чем довольно ясно написано в MSDN.


Автор: madbizarre 28.10.2010, 20:33
Ты 100% преподователем работаешь smile Мне нужна помощь, да на MSDN описано вроде понятно smile
Цитата

Проверка, чтобы видеть, начинается ли текст элемента со строки, на которую указывает psz элемент. Это значение подразумевает использование LVFI_STRING

Но вот как его втыркнуть в мой екст программы, до меня ну ни как не доходит. Помоги на примере, если так важно не на моём. Но чтобы я видел наглядно использование этого макроса с этими параметрами, ну ООООЧЕНЬ прошу smile Мне осталась функция поиска и можно курсач сдавать

Автор: BorisVorontsov 28.10.2010, 22:51
Код

    LVFINDINFO LVFI = {};
    LVFI.flags = LVFI_STRING | LVFI_PARTIAL;
    LVFI.psz = _T("sometext");
    int nItem = ListView_FindItem(hListView, -1, &LVFI);

Автор: madbizarre 29.10.2010, 09:01
Спасибо, заработало. Есть еще вопрос, он ищет по 1 столбику, а по другим можно осуществить?

Автор: BorisVorontsov 29.10.2010, 12:36
Цитата(madbizarre @  29.10.2010,  09:01 Найти цитируемый пост)
а по другим можно осуществить?

Нет, по другим только вручную, посредством перебора подпунктов соответствующей колонки и сравнения с текстом с помощью lstrcmpi/_tcscmpi

Автор: madbizarre 29.10.2010, 13:53
А почему от того меняю я значение iStart или нет в макросе ListView_FindItem, у меня всё равно ищет с -1 позиции. Т.е. я столкнулся с такой проблемой, что если у меня в сроках есть два одинаковых наименование, первое встречается на 5 строке, второе встречается на 10, то он ищет только ближнюю, а 10 игнорирует!

Автор: BorisVorontsov 30.10.2010, 12:13
А ты правильный стартовый индекс указываешь?

Автор: madbizarre 2.11.2010, 08:35
Да я указывая в ручную с 8 индекса получается в 10 строке слово совпадает а строка не выделяется :-(

Автор: madbizarre 2.11.2010, 23:23
Почему не осуществляется последовательный поиск... Если в таблице, существует несколько строк с искомым вариантом, должен выделять при каждом нажатии на ОК, след строку с нужным текстом, но этого не происходит
Код

            case IDOK:
            GetDlgItemText(hDlg,POISK,szBuf,30);
            LVFI.flags=LVFI_STRING | LVFI_PARTIAL;
            LVFI.psz=szBuf;
            ind=ListView_FindItem(hList,iStart-1,&LVFI);
            iStart=ind+1;
            ListView_SetItemState(hList, ind, LVIS_SELECTED,  LVIS_SELECTED);
            break;

Автор: Earnest 3.11.2010, 07:52
Цитата(madbizarre @  3.11.2010,  00:23 Найти цитируемый пост)
ind=ListView_FindItem(hList,iStart-1,&LVFI);
            iStart=ind+1;

Даже если iStart - статическая переменная и сохраняет свое значение между вызовами, ты всегда начинаешь поиск с найденного прошлый раз элемента. И, соотвественно, находишь именно его. 

Автор: BorisVorontsov 3.11.2010, 22:18
Earnest, в MSDN четко написано
Цитата(MSDN)

iStart
int
The index of the item after which to begin the search, or -1 to start from the beginning.


Автор: Earnest 4.11.2010, 16:29
Хм... странно, а я вроде всегда считала, что поиск начинается именно с переданного индекса, и вроде оно всегда получалось...
Так ведь проверить не сложно. Отладчик в зубы и вперед. А если и вправду все время находится самый первый, так может и нет больше?

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