Как через SendMessage выделить конкретную строку в ListView?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Как через SendMessage выделить конкретную строку в ListView?

Сообщение kibernetics » 26.08.2015 (Ср) 20:26

Добрый день!
Как через SendMessage выделить нужную строку в пользовательском ListView?
ListView.ViewMode = vmDetails
Если кто вспомнит - подскажите пожалуйста.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение kibernetics » 26.08.2015 (Ср) 21:03

Так, нашёл одну конструкцию:
Код: Выделить всё
'in module
    Private Type LV_ITEM
       Mask As Long
       iItem As Long
       iSubItem As Long
       State As Long
       stateMask As Long
       pszText As String
       cchTextMax As Long
       iImage As Long
       lParam As Long
       iIndent As Long
    End Type
   
    Private Const LVM_FIRST As Long = &H1000
    Private Const LVM_GETTOPINDEX As Long = (LVM_FIRST + 39)
    Private Const LVM_GETCOUNTPERPAGE As Long = (LVM_FIRST + 40)
    Private Const LVM_SETITEMSTATE As Long = (LVM_FIRST + 43)
    Private Const LVIS_FOCUSED As Long = &H1
    Private Const LVIS_SELECTED As Long = &H2
    Private Const LVIF_STATE As Long = &H8

'in procedure
        LV
            .Mask = LVIF_STATE
            .State = True
            .stateMask = LVIS_SELECTED Or LVIS_FOCUSED
        End With
        Call SendMessage(.Hwnd, LVM_SETITEMSTATE, iIndex, LV)


теперь выделяет строку в ListView, но в режиме как бы ghost, т.е. не синяя такая выделенная строка, а серенькая, едва заметная. Как обозначить, чтобы синим выделяло, как будто пользователь кликнул?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение iGrok » 27.08.2015 (Чт) 1:05

Могу ошибаться, но по-моему это вопрос наличия фокуса на LV. Попробуй SetFocus на него.
label:
cli
jmp label

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение kibernetics » 27.08.2015 (Чт) 9:09

iGrok писал(а):Могу ошибаться, но по-моему это вопрос наличия фокуса на LV. Попробуй SetFocus на него.

тоже так показалось,
попробовал Me.Controls("myLvw").SetFocus, уже не помню правда что за ошибка, то ли свойства такого нет вроде у объекта.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение Хакер » 27.08.2015 (Чт) 12:16

Люди, которые пишут, что видели какую-то ошибку, но не пишут, какую в точности — что у них на уме? Чего они хотят? Просто поболтать? Вызвать сочувствие?

Уж точно они хотят что угодно, но не рашить свою проблему, ибо в противном случае они бы не занимались такой глупостью.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение kibernetics » 27.08.2015 (Чт) 13:13

Хакер писал(а):Люди, которые пишут, что видели какую-то ошибку, но не пишут, какую в точности — что у них на уме? Чего они хотят? Просто поболтать? Вызвать сочувствие?

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

Об этом не сказано в инструкции - сообщать об увиденных ошибках. А равно захотел сказал, захотел - нет. Очевидно, что проблема не в этом, и сообщив об ошибке, все ринулись бы исследовать ошибку из другой оперы. А это заведомо ложный путь. Поэтому не надо так расстраиваться из-за отсутствующего описания этой ошибки. Не сообщил, значит были на то причины.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение Хакер » 27.08.2015 (Чт) 13:17

Ты вообще адекватен? Какой инструкции?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение kibernetics » 27.08.2015 (Чт) 13:35

Хакер писал(а):Ты вообще адекватен? Какой инструкции?

Хакер, ты всегда живёшь по каким-то инструкциям, одному тебе известным.
И это одна из них:
Хакер писал(а):Люди, которые пишут, что видели какую-то ошибку, но не пишут, какую в точности — что у них на уме? Чего они хотят? Просто поболтать? Вызвать сочувствие?

т.е. если есть ошибка, то непременно должно выкладываться описание ошибки, иначе это требующий сочувствия человек, который хочет поболтать.

Но это не так. Ты не можешь ставить таким образом условие, если вдруг не получил описания.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение Хакер » 27.08.2015 (Чт) 13:38

Какое условие? О чём ты вообще.

Механизм работы работы форума прост. Ты хочешь получить помощь — ты содействуешь получению помощи.
Содействовать в получении помощи, это значит, в числе прочего, сообщать о проблемах, в случае, если они возникли в ходе того, как ты воплотил в жизнь какой-то совет, данный тебе на форуме.

Тебе дали совет — ставить фокус на контрол. Он тебя не устраивает тем, что даёт ошибку. При этом, какую именно ошибку он даёт, ты говорить не намерен.

Не хочешь содействовать? Не надо отнимать у других время, играя в бессмысленную игру.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение kibernetics » 27.08.2015 (Чт) 14:02

Хакер писал(а):Не хочешь содействовать? Не надо отнимать у других время, играя в бессмысленную игру.

Я хочу содействовать, это же моя проблема, и я пришёл к вам за помощью. И я наоборот не хочу отнимать времени, ради, как я считаю, ошибки из другой оперы.
Мне кажется так, если нет изначально решения этой проблемы, то всё - никто ничем не поможет. Это не старые добрые двухтысячные, когда ради чьей-то проблемы, местные энтузиасты могли расколупать dll или api.
Ну и твой резкий вопрос уже просто отрезал окончательно путь к решению. А всего-то хотелось иметь интеллектуальный ListView.
Ну и конечно же вот ошибка:
Run-time error '438':
Object doesn't support this property or method

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение Хакер » 27.08.2015 (Чт) 14:10

kibernetics писал(а):А всего-то хотелось иметь интеллектуальный ListView.

А текущий что? Не интеллектуальный? Или интеллектуальность появляется как только список начинает подкрашивать выделенный пункт синим всегда, а не только тогда, когда имеет фокус? Это критерий интеллектуальности.

Что-то не так с твоим видением мира, не иначе.

kibernetics писал(а):Object doesn't support this property or method

И какой ListView ты используешь? Сдаётся мне, что контрол под именем myLvw — это не ListView, а что-то другое.

И какой вообще смысл писать
Me.Controls("myLvw").SetFocus
вместо
myLvw.SetFocus
?

И вообще, тебе нужно иметь способ держать LV всё время в фокусе, или тебе нужно, чтобы пункты горели синим даже без фокуса?

И почему ты, наряду с запутанным способом вызова метода SetFocus, для изменения выделенной строчки пользуешься не штатным способом, а хочешь делать это через оконные сообщения? Ты участвуешь в конкурсе «как написать боле запутанный код и при этом заморочить людей на форуме странно сформулированными вопросами»?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение kibernetics » 27.08.2015 (Чт) 14:28

Хакер писал(а):
kibernetics писал(а):А всего-то хотелось иметь интеллектуальный ListView.

А текущий что? Не интеллектуальный? Или интеллектуальность появляется как только список начинает подкрашивать выделенный пункт синим всегда, а не только тогда, когда имеет фокус? Это критерий интеллектуальности.

Что-то не так с твоим видением мира, не иначе.

Не интеллектуальный. Просто чёрным по белому текст в ячейках. И вот встречаются моменты когда просто необходимо выделить программно строку. Потому что задать цвет вообще не реально.


Хакер писал(а):
kibernetics писал(а):Object doesn't support this property or method

И какой ListView ты используешь? Сдаётся мне, что контрол под именем myLvw — это не ListView, а что-то другое.

Это пользовательский ListView, основан на ComCtl5.


Хакер писал(а):И какой вообще смысл писать
Me.Controls("myLvw").SetFocus
вместо
myLvw.SetFocus
?

Бесспорно. Просто было удобнее скопипастить готовый текст, чем наново набирать.


Хакер писал(а):И вообще, тебе нужно иметь способ держать LV всё время в фокусе, или тебе нужно, чтобы пункты горели синим даже без фокуса?

Крайне желательно, чтобы горели даже без фокуса. Это основная информация, которая должна быть всегда как говорится быть на виду.


Хакер писал(а):И почему ты, наряду с запутанным способом вызова метода SetFocus, для изменения выделенной строчки пользуешься не штатным способом, а хочешь делать это через оконные сообщения? Ты участвуешь в конкурсе «как написать боле запутанный код и при этом заморочить людей на форуме странно сформулированными вопросами»?

Весь проект написан вокруг этого контрола, и чтобы впихнуть стандарнтый ListView это просто потребует колоссальные затраты на переделку всего написанного.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение kibernetics » 27.08.2015 (Чт) 14:35

На всякий пожарный хочу приложить для ознакомления.
Modules.rar
(27.31 Кб) Скачиваний: 183

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение bon818 » 28.08.2015 (Пт) 10:10

kibernetics писал(а):необходимо выделить программно строку. Потому что задать цвет вообще не реально.
Крайне желательно, чтобы горели даже без фокуса.

Использовать: Сообщение NM_CUSTOMDRAW для перерисовки всего что отображает LV.
В Вашем 'ListV' даже есть готовая ф-я для этого pvCustomDraw

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение kibernetics » 28.08.2015 (Пт) 15:13

bon818 писал(а):
kibernetics писал(а):необходимо выделить программно строку. Потому что задать цвет вообще не реально.
Крайне желательно, чтобы горели даже без фокуса.

Использовать: Сообщение NM_CUSTOMDRAW для перерисовки всего что отображает LV.
В Вашем 'ListV' даже есть готовая ф-я для этого pvCustomDraw


т.е. надо заново наполнить ListView и в определённый момент (на нужной строке) слать NM_CUSTOMDRAW? Уфф... а можно полгче объяснить или лучше показать хотябы отдалённым примером?

П.С. а там в коде не видно, может как-то и закрасить можно? неважно, ячейку или строку.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как через SendMessage выделить конкретную строку в ListV

Сообщение kibernetics » 30.08.2015 (Вс) 10:53

А можно сделать события клика мышкой программно? Вплоть до того, что курсор подвести к этому месту и кликнуть на нужной строке, если нужно.
Чтобы не заморачиваться с месседжами, всё равно больше помощи ждать не от кого.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24

    TopList