Фиксация столбца ListView в AllowColumnReorder=True

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Фиксация столбца ListView в AllowColumnReorder=True

Сообщение Rojohn » 05.12.2006 (Вт) 16:58

Доброго дня!
Возникла необходимость зафиксировать первый столбец ListView в режиме AllowColumnReorder=True. Нужно сделать так, чтобы можно было менять рассположение всех столбцов, кроме первого. Видел тут пример:
[url]
http://www.ewbi.com/ewbi.develop/sample ... vents2.zip
[/url]
Но там закрывается только изменение размера. Хотя прописаны все события. Так как в API я пока слабоват, может подскажете, что туда добавить, чтобы осуществить задуманное:?: Или как правильно заюзать модуль из примера выше для тех же целей :?:
Спасибо заранее!
Последний раз редактировалось Rojohn 05.12.2006 (Вт) 22:39, всего редактировалось 1 раз.
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 05.12.2006 (Вт) 19:08

Как понять
зафиксировать заголовок первого столбца ListView
?

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Comment

Сообщение Rojohn » 05.12.2006 (Вт) 22:37

Ну, судя по моему вопросу, ему надо не дать перемещаться и другому не дать переместиться на его место (то есть AllowColumnReorder=False только для первого столбца, для остальных AllowColumnReorder=True). Написал "заголовка" потому ColumnReorder происходит при Action = lvHeaderActionDragBegin для заголовка (см. пример)... Мне казалось, что эта процедура отключает все перечисленные там события, но почему-то на практике работает только ширина, может надо как-то по-другому оформить вызов :?:
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Comment1

Сообщение Rojohn » 06.12.2006 (Ср) 12:25

Ну что, есть какие-нибудь мысли :?: Если так сделать нельзя, то хоть дайте знать...
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 06.12.2006 (Ср) 22:53

Нужно добраться до header -а как контрола и перехватывать сообщения, ему отсылаемые.

Узнать hwnd можно, послав сообщение LVM_GETHEADER для Listview.:

Код: Выделить всё
hwndHeader = SendMessage(Listview.hwnd, LVM_GETHEADER, 0, 0)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

??

Сообщение Rojohn » 07.12.2006 (Чт) 0:10

В приведенном примере это уже реализовано, там в Function HandleListViewHeaderMsgs есть строка:
Код: Выделить всё
HeaderhWnd = SendMessage(ListViewhWnd, LVM_GETHEADER, 0&, ByVal 0&)

И событие нужное вроде проверяется и выдается в ListViewHeaderEventDebugPrint, но когда делаешь в самом коде:
Код: Выделить всё
Public Function lvwPrint_HeaderEvent(ByVal Action As lvHeaderActions, ByVal Column As Long) As Boolean
  If Column = 1 Then lvwPrint_HeaderEvent = True
End Function

То блокируется только изменение ширины колонки, а её перемещение нет.
Может просто что-то надо добавить или вызвать по-другому :?:
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 15.12.2006 (Пт) 11:04

А между прочим тема ещё не закрыта... Наверное такое вообще невозможно сделать, не переписав контрол заново :?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.12.2006 (Пт) 11:14

HDN_BEGINDRAG Notification
Sent by a header control when a drag operation has begun on one of its items.
To allow the header control to automatically manage drag-and-drop operations, return FALSE. If the owner of the control is manually performing drag-and-drop reordering, return TRUE.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 25.12.2006 (Пн) 13:47

Спасибо GSerg, хоть что-то для размышления! Но, боюсь, мне пока трудновато это осуществить в виде кода. Хоть намекни, как это прописывается?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.12.2006 (Пн) 13:51

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

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 25.12.2006 (Пн) 15:45

Вообще-то код писал не я и я далеко не всё в нём понимаю пока что. Но предполагаю, что начало изменения ширины (а в моём случае начало перетаскивания) определяется в Case
Код: Выделить всё
Case HDN_BEGINDRAG:       HeaderAction = lvHeaderActionDragBegin

а потом отменяется для определенной колонки в участке кода:
Код: Выделить всё
If HeaderAction <> 0 Then
   On Error Resume Next
   Set ListViewControl = RegisteredListViewControls(CStr(ListViewhWnd))
        CancelMsg = CallByName(ListViewControl.parent,   ListViewControl.Name & EVENT_SUFFIX, VbCallType.VbMethod, HeaderAction, HitTestInfo.iItem + 1)
  On Error GoTo 0
  If CancelMsg Then
     HandleListViewHeaderMsgs = 1
     Exit Function
   End If
End If

Но о подробностях могу только догадываться... Я прав? Куда искать-то?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 10.01.2007 (Ср) 10:31

Я не прав?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)


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

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

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

    TopList