Страница: 1 |
Страница: 1 |
Вопрос: клики в ListView
Добавлено: 24.04.05 19:37
Автор вопроса: Yura | ICQ: 34372249
Надо получить запись(текст), из item'а в listview по клику на нему(по итему).
Я это сделал временно пока так:
Dim Item As New ListViewItem
Dim formy, yy As Integer
yy = ListView1.MousePosition.Y
formy = Me.Top
Item = ListView1.GetItemAt(10, yy - formy - 33)
txtService.Text = Item.Text
Но это на мой взгляд не правильно. 33 это висота в точках от компонента(на сколько я понял, даже не от компонента, а от первой сточки, не считая высоты заголовов столбцов) listview до верхнего края формы. число 10 тоже просто из воздуха, тк оно относительно клиента ставиться...
Вопрос. При смене стилей, размера шрифта и перехода в xp стайл(проверить к сожалению не могу тк стоит 2003 server), должно поменяться и это расстояние(33), которое я опытным путем вывел, для корректного обращения к требуемой записи по клику. поэтому на других компах могут быть небольшые несоответствия.
как правильно надо реализовать эту функцию?
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #1
Добавлено: 24.04.05 20:50
LVM_SUBITEMHITTEST, SendMessage.
В отличие от штатного HitTest - позволит определить саб-айтем (а не только айтем).
Номер ответа: 2
Автор ответа:
Yura
ICQ: 34372249
Вопросов: 3
Ответов: 8
Профиль | | #2
Добавлено: 25.04.05 00:39
А по подробней по этой теме можно?
Маны хотя бы какие нибудь? или (буду оч благодарен) за пример(проект(часть))?
web---master[a]yandex.ru
Номер ответа: 3
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #3
Добавлено: 25.04.05 10:53
Private Type lvwMsgInfo
X As Long
Y As Long
Flgs As Long
Itm As Long
SubItm As Long
End Type
Dim lvwMsg As lvwMsgInfo
Private Sub ListView1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
lvwMsg.X = X / Screen.TwipsPerPixelX
lvwMsg.Y = Y / Screen.TwipsPerPixelY
SendMessage ListView1.hwnd, 4153, 0, lvwMsg
If lvwMsg.Flgs And 14 Then
Text1 = ListView1.ListItems(lvwMsg.Itm + 1).Text
If lvwMsg.SubItm Then Text1 = ListView1.ListItems(lvwMsg.Itm + 1).SubItems(lvwMsg.SubItm)
End If
End Sub
Номер ответа: 4
Автор ответа:
Yura
ICQ: 34372249
Вопросов: 3
Ответов: 8
Профиль | | #4
Добавлено: 25.04.05 11:45
X As Long
Y As Long
Flgs As Long
Itm As Long
SubItm As Long
End Type
Dim lvwMsg As lvwMsgInfo
Private Sub ListView1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
lvwMsg.X = X / Screen.TwipsPerPixelX
lvwMsg.Y = Y / Screen.TwipsPerPixelY
SendMessage ListView1.hwnd, 4153, 0, lvwMsg
If lvwMsg.Flgs And 14 Then
Text1 = ListView1.ListItems(lvwMsg.Itm + 1).Text
If lvwMsg.SubItm Then Text1 = ListView1.ListItems(lvwMsg.Itm + 1).SubItems(lvwMsg.SubItm)
End If
End Sub
Это для VB6. A Wizard vb6->vb.net неправильно его переводит. А квалификации не хватает чтоб это сделать самому, появляется ещё куча вопросов. Проект готов на 95%, остается только вот эта часть. Даже обработка ошибок готова почти на 100.
Как правильно перевести эту функцию под .NET?
Номер ответа: 5
Автор ответа:
Yura
ICQ: 34372249
Вопросов: 3
Ответов: 8
Профиль | | #5
Добавлено: 25.04.05 11:52
После wizarda получилось нечто
Private Structure lvwMsgInfo
Dim X As Integer
Dim Y As Integer
Dim Flgs As Integer
Dim Itm As Integer
Dim SubItm As Integer
End Structure
Dim lvwMsg As lvwMsgInfo
Private Sub ListView1_MouseDown(ByRef Button As Short, ByRef Shift As Short, ByRef X As Single, ByRef Y As Single)
Dim Text1 As Object
Dim ListView1 As Object
Dim SendMessage As Object
lvwMsg.X = X / VB6.TwipsPerPixelX
lvwMsg.Y = Y / VB6.TwipsPerPixelY
'UPGRADE_WARNING: Couldn't resolve default property of object ListView1.hwnd. Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"'
SendMessage(ListView1.hwnd, 4153, 0, lvwMsg)
If lvwMsg.Flgs And 14 Then
'UPGRADE_WARNING: Couldn't resolve default property of object ListView1.ListItems. Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"'
'UPGRADE_WARNING: Couldn't resolve default property of object Text1. Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"'
Text1 = ListView1.ListItems(lvwMsg.Itm + 1).Text
'UPGRADE_WARNING: Couldn't resolve default property of object ListView1.ListItems. Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"'
'UPGRADE_WARNING: Couldn't resolve default property of object Text1. Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"'
If lvwMsg.SubItm Then Text1 = ListView1.ListItems(lvwMsg.Itm + 1).SubItems(lvwMsg.SubItm)
End If
End Sub
Ещё столкнулся с проблемой декларации SendMessage, тк в .NET отсутствует тип ANY. Как её надо декларировать?