ListView и Drag&Drop

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sorch
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 13.01.2006 (Пт) 10:42
Откуда: Петербург

ListView и Drag&Drop

Сообщение Sorch » 26.01.2006 (Чт) 11:27

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

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 26.01.2006 (Чт) 11:48

А что ты в событии DragDrop указываешь?
Старый глюк лучше новых двух!

Sorch
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 13.01.2006 (Пт) 10:42
Откуда: Петербург

Сообщение Sorch » 26.01.2006 (Чт) 11:56

OLEDragMode - manual (но пробовал и автомат, результат тот же)
OLEDropMode - manual

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

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

Нда...

Короче на форме ставишь кнопку в любом месте и ListView тоже где угодно и форму тоже любых размеров, весь код формы заменяешь этим и по рабочему моему примеру должен понять как это делается

Код: Выделить всё
Private Sub Command1_Click()



ListView1.View = lvwReport
ListView1.ColumnHeaders.Add , , "Язык"
ListView1.ColumnHeaders.Add , , "Синтаксис блоков"
ListView1.ListItems.Add(, , "Java").SubItems(1) = "{ }"
ListView1.ListItems.Add(, , "VBScript").SubItems(1) = "*  End*"
ListView1.ListItems.Add(, , "Visua Basic").SubItems(1) = "* End*"
ListView1.ListItems.Add(, , "Pascal").SubItems(1) = "BEGIN END"
ListView1.ListItems.Add(, , "C++").SubItems(1) = "{ }"
ListView1.ListItems.Add(, , "QBasic").SubItems(1) = "* END*"
ListView1.OLEDragMode = ccOLEDragAutomatic
ListView1.OLEDropMode = 1
End Sub




Private Sub Form_Load()
Me.Width = 6750
Me.Height = 5415

ListView1.Height = 4110
ListView1.Width = 6390
ListView1.Top = 735
ListView1.Left = 90

Command1.Top = 75
Command1.Left = 90
Command1.Height = 570
Command1.Width = 6375
Command1.Caption = "ЗАПОЛНИТЬ LIST-VIEW"
End Sub

Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
Dim li As ListItem
Dim nc As Long
nc = ListView1.ListItems.Count
cSubItems = ListView1.FindItem(Data.GetData(1)).SubItems(1)
Effect = OLEDropEffectConstants.vbDropEffectMove
Set li = ListView1.ListItems.Item(1)
Set li = ListView1.ListItems.Add(Switch(y \ li.Height > nc, nc + 1, y \ li.Height < 1, 1, True, y \ li.Height), , Data.GetData(1))
li.SubItems(1) = cSubItems
End Sub
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sorch
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 13.01.2006 (Пт) 10:42
Откуда: Петербург

Сообщение Sorch » 26.01.2006 (Чт) 13:34

Большое человеческое спасибо за пример!
А "y" - это как я понял положение курсора или нет?
при перемещении эл-та вверх все работает, а вот вниз работает не коректно почему то .... Вставил твой код к себе в программу, все работает, но у меня 4 колонки в строке. Как это реализовать?

Sorch
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 13.01.2006 (Пт) 10:42
Откуда: Петербург

Сообщение Sorch » 26.01.2006 (Чт) 13:49

тааак ... со столбцами разобрался .... :D

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

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

Ну вот, пока я печатал ты уже разобрался... :(

НУ ВОТ ТО, ЧТО БЫ Я ТЕБЕ ОТВЕТИЛ ЕСЛИ БЫ НЕТ ПОСЛЕДНИЙ ПОСТ.

Вроде бы так... Хотя писал в Блокноте, а точнее в Бреде и поэтому могут быть ошибки.
Код: Выделить всё

Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
Dim li As ListItem
Dim nc As Long
Dim SubItemsBuffer() As String
nc = ListView1.ListItems.Count
ReDim SubItemsBuffer(1 To ListView1.ColumnHeaders.Count)
For i = 1 To ListView1.ColumnHeaders.Count
   SubItemsBuffer(i) = ListView1.FindItem(Data.GetData(1)).SubItems(i)
next i
cSubItems = ListView1.FindItem(Data.GetData(1)).SubItems(1)
Effect = OLEDropEffectConstants.vbDropEffectMove
Set li = ListView1.ListItems.Item(1)
NewPosition = (Y \ li.Height )
If NewPosition = 0 Then NewPosition = 1
If NewPosition > nc Then NewPositon = nc
Set li = ListView1.ListItems.Add(NewPosition), , Data.GetData(1))
For i = 1 To ListView1.ColumnHeaders.Count
   Li.SubItems(i) = SubItemsBuffer(i)
next i
End Sub

Y - это У координтата места где была опущена кнопка мышки. Чтобы узнать номер строки нужно поделить этот У на высоту строки. Я немножко упростил код для нахождения новой позиции.

Про некорректности: Все некорректности получаются только из этого кода (если некорректности в перемещении т.е. номере строки)
NewPosition = (Y \ li.Height )
If NewPosition = 0 Then NewPosition = 1
If NewPosition > nc Then NewPositon = nc


Попробуй поэкспериментировать с этим кусочком, например Then NewPosition = nc + 1 или в самом начале где происходит деление +1
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sorch
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 13.01.2006 (Пт) 10:42
Откуда: Петербург

Сообщение Sorch » 26.01.2006 (Чт) 14:17

Вот в чем косяк, привожу цифры
При перемещении снизу вверх все ОК
При перемещении сверху вниз:

Switch(Y \ li.Height > nc , nc + 1, Y \ li.Height < 1 ,1
330 \ 209 > 6 , nc + 1 , 330 \ 209 <1 ,1

и получается, что пока Y \l i.Heigh не станет > чем число строк в ListView, перемещения не будет

Sorch
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 13.01.2006 (Пт) 10:42
Откуда: Петербург

Сообщение Sorch » 26.01.2006 (Чт) 14:39

Ура! Нашел!!!!

Set li = ListView1.ListItems.Add(Switch(Y \ li.Height > nc, nc + 1, Y \ li.Height < 1, 1, True, Y \ li.Height + 1), , Data.GetData(1))


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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот, SemrushBot и гости: 162

    TopList