LVM_FINDITEM

Тема в разделе "WASM.BEGINNERS", создана пользователем dgs, 2 авг 2008.

  1. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Привет всем. Тут такая странность на фасме... вот сообщение LVM_FINDITEM не возвращает номер найденного элемента. Может кто скажет какую детскую ошибку я сделал... :)
    Код (Text):
    1.         mov     [lvf.flags], LVFI_STRING
    2.         mov     eax, [str]
    3.         mov     [lvf.psz],  eax
    4.         invoke  SendMessage,[hlist],LVM_FINDITEM,[sts],lvf
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    dgs
    Что в sts?
     
  3. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Ну так sts - это dword число которое показывает системе с кого пункта требуется начинать поиск (states).
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    dgs
    Спрошу по другому.
    Какое значение содержит переменная sts перед выполнением SendMessage когда "сообщение LVM_FINDITEM не возвращает номер найденного элемента"?

    + какое значение возвращает SendMessage?
    + что такое и как инициализирована переменная str?
    + ты уверен, что, то, что ты ищешь, есть в listview?
     
  5. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Ладно это сообщение возвращает -1 ну типа элемент не найден, хотя он есть в ListView. sts по MSDN держит в себе -1 для того чтобы начать поиск с первого элемента LISTView'a (пробовал и другие значения). str это указатель на строку который передается через стек.

    Может я чего не понял в описании:
    или тут

     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    dgs
    :dntknw: издеваешься или я непонятно спрашиваю?
    Я не прошу тебя продемонстрировать твои знания документации и освежить мои.
    Я прошу тебя показать _твой_код_, который заполняет/инициализирует переменные lvf, sts и str. Желательно от момента их определения/объявления до вызова SendMessage _включительно_.
     
  7. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Большое спасибо за попытку оказать мне помощь, но я переписал с нуля половину программы. Поиск начал работать с помощью перебора. Полный проект можно загрузить: http://everhest1.narod.ru/Example.rar, а процедуры для поиска и перебора: http://everhest1.narod.ru/Find.rar
     
  8. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Большое спасибо за попытку оказать мне помощь и прошу прощение за мою некоторую непонятливость, но я переписал с нуля половину программы. Поиск начал работать с помощью перебора. Полный проект можно загрузить: http://everhest1.narod.ru/Example.rar, а процедуры для поиска и перебора: http://everhest1.narod.ru/Find.rar
    Но есть маленькая проблема, если есть выбранные элементы(с индексом I1) и мы нажимаем на кнопку поиск(находиться элемент с индексом I2), выделяются все элементы между I1 и I2. :)
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    dgs
    выделяются все элементы между I1 и I2
    Точнее будет сказать "к уже выделенным/помеченным элементам добавляется вновь найденный".
    Прежде чем пометить найденный, надо снять пометку с текущего помеченного.
     
  10. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    А как это сделать? выделить элемент с индексом -1 или как???
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    dgs
    Например
    Код (Text):
    1. ...
    2. ;; снять пометки со всех элементов
    3. mov [lvi.state], 0
    4. mov [lvi.stateMask], LVIS_SELECTED
    5. invoke  SendMessage, [hList], LVM_SETITEMSTATE, -1, lvi
    6.  
    7. ;; пометить найденный
    8. mov [lvi.state], LVIS_SELECTED  ;; если хочешь +LVIS_FOCUSED
    9. mov [lvi.stateMask], LVIS_SELECTED  ;; если хочешь +LVIS_FOCUSED
    10. invoke  SendMessage, [hList], LVM_SETITEMSTATE, [iItem], lvi
    11. ...
     
  12. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Большое спасибо, вы мне очень помогли. Тема закрыта...
     
  13. HeadHunter

    HeadHunter New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2009
    Сообщения:
    30
    Может и мне кто поможет?

    LVM_FINDITEM производит поиск только по главным элементам, как организовать поиск под-элементов (subitem)? Прочесал весь инет, ответов нет, даются только предложения самому обрабатывать сообщение LVM_FINDITEM, но я думаю этот идиотизм, должен же быть способ попроще. На MSDN что то написано про lParam, но в англицком не достаточно силен. Как я понял для нужных subitem-ов нужно дополнительно указывать lParam, в котором содержится что-то вроде метки, по которой и нужно потом искать. Прокомментируйте пожалуйста вопрос.