Привет всем. Тут такая странность на фасме... вот сообщение LVM_FINDITEM не возвращает номер найденного элемента. Может кто скажет какую детскую ошибку я сделал... Code (Text): mov [lvf.flags], LVFI_STRING mov eax, [str] mov [lvf.psz], eax invoke SendMessage,[hlist],LVM_FINDITEM,[sts],lvf
Ну так sts - это dword число которое показывает системе с кого пункта требуется начинать поиск (states).
dgs Спрошу по другому. Какое значение содержит переменная sts перед выполнением SendMessage когда "сообщение LVM_FINDITEM не возвращает номер найденного элемента"? + какое значение возвращает SendMessage? + что такое и как инициализирована переменная str? + ты уверен, что, то, что ты ищешь, есть в listview?
Ладно это сообщение возвращает -1 ну типа элемент не найден, хотя он есть в ListView. sts по MSDN держит в себе -1 для того чтобы начать поиск с первого элемента LISTView'a (пробовал и другие значения). str это указатель на строку который передается через стек. Может я чего не понял в описании: или тут
dgs издеваешься или я непонятно спрашиваю? Я не прошу тебя продемонстрировать твои знания документации и освежить мои. Я прошу тебя показать _твой_код_, который заполняет/инициализирует переменные lvf, sts и str. Желательно от момента их определения/объявления до вызова SendMessage _включительно_.
Большое спасибо за попытку оказать мне помощь, но я переписал с нуля половину программы. Поиск начал работать с помощью перебора. Полный проект можно загрузить: http://everhest1.narod.ru/Example.rar, а процедуры для поиска и перебора: http://everhest1.narod.ru/Find.rar
Большое спасибо за попытку оказать мне помощь и прошу прощение за мою некоторую непонятливость, но я переписал с нуля половину программы. Поиск начал работать с помощью перебора. Полный проект можно загрузить: http://everhest1.narod.ru/Example.rar, а процедуры для поиска и перебора: http://everhest1.narod.ru/Find.rar Но есть маленькая проблема, если есть выбранные элементы(с индексом I1) и мы нажимаем на кнопку поиск(находиться элемент с индексом I2), выделяются все элементы между I1 и I2.
dgs выделяются все элементы между I1 и I2 Точнее будет сказать "к уже выделенным/помеченным элементам добавляется вновь найденный". Прежде чем пометить найденный, надо снять пометку с текущего помеченного.
dgs Например Code (Text): ... ;; снять пометки со всех элементов mov [lvi.state], 0 mov [lvi.stateMask], LVIS_SELECTED invoke SendMessage, [hList], LVM_SETITEMSTATE, -1, lvi ;; пометить найденный mov [lvi.state], LVIS_SELECTED ;; если хочешь +LVIS_FOCUSED mov [lvi.stateMask], LVIS_SELECTED ;; если хочешь +LVIS_FOCUSED invoke SendMessage, [hList], LVM_SETITEMSTATE, [iItem], lvi ...
Может и мне кто поможет? LVM_FINDITEM производит поиск только по главным элементам, как организовать поиск под-элементов (subitem)? Прочесал весь инет, ответов нет, даются только предложения самому обрабатывать сообщение LVM_FINDITEM, но я думаю этот идиотизм, должен же быть способ попроще. На MSDN что то написано про lParam, но в англицком не достаточно силен. Как я понял для нужных subitem-ов нужно дополнительно указывать lParam, в котором содержится что-то вроде метки, по которой и нужно потом искать. Прокомментируйте пожалуйста вопрос.