Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> LB_FINDSTRING, всегда возвращает -1 
:(
    Опции темы
madbizarre
Дата 26.10.2010, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Копирую в 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);

PM MAIL   Вверх
Earnest
Дата 27.10.2010, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



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


--------------------
...
PM   Вверх
madbizarre
Дата 27.10.2010, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Неподскажешь примерный вид куска текста? Ато алгоритм то я понимаю в целом, а вот вин апи плохо знаю.
PM MAIL   Вверх
BorisVorontsov
Дата 27.10.2010, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



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

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


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
madbizarre
Дата 28.10.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А можно подробное описание этого макроса? Какие параметры и что возвращает?
PM MAIL   Вверх
BorisVorontsov
Дата 28.10.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



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


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
madbizarre
Дата 28.10.2010, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

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
PM MAIL   Вверх
BorisVorontsov
Дата 28.10.2010, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



Скорее всего, строка не совпадает полностью с текстом пункта.
Цитата(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.




--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
madbizarre
Дата 28.10.2010, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

Но вот как его втыркнуть в мой екст программы, до меня ну ни как не доходит. Помоги на примере, если так важно не на моём. Но чтобы я видел наглядно использование этого макроса с этими параметрами, ну ООООЧЕНЬ прошу smile Мне осталась функция поиска и можно курсач сдавать
PM MAIL   Вверх
BorisVorontsov
Дата 28.10.2010, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



Код

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



--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
madbizarre
Дата 29.10.2010, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, заработало. Есть еще вопрос, он ищет по 1 столбику, а по другим можно осуществить?
PM MAIL   Вверх
BorisVorontsov
Дата 29.10.2010, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



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

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


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
madbizarre
Дата 29.10.2010, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А почему от того меняю я значение iStart или нет в макросе ListView_FindItem, у меня всё равно ищет с -1 позиции. Т.е. я столкнулся с такой проблемой, что если у меня в сроках есть два одинаковых наименование, первое встречается на 5 строке, второе встречается на 10, то он ищет только ближнюю, а 10 игнорирует!
PM MAIL   Вверх
BorisVorontsov
Дата 30.10.2010, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



А ты правильный стартовый индекс указываешь?


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
madbizarre
Дата 2.11.2010, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да я указывая в ручную с 8 индекса получается в 10 строке слово совпадает а строка не выделяется :-(
PM MAIL   Вверх
madbizarre
Дата 2.11.2010, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

            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;

PM MAIL   Вверх
Earnest
Дата 3.11.2010, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



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

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


--------------------
...
PM   Вверх
BorisVorontsov
Дата 3.11.2010, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



Earnest, в MSDN четко написано
Цитата(MSDN)

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




--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Earnest
Дата 4.11.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



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



--------------------
...
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


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

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


 




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


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

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