|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
ListBox и Drag&Drop
Доброго всем времени суток... обрыл весь поиск нигде не нашёл упоминания, как сделать с ListBox нечто вроде списка контактов в qip, а именно, чтобы при перетаскивании отображалась полоска с позицией куда будет помещен при перетаскивании элемент списка... Как вариант есть идея отображать при перетаскивании bevel высотой 1 пиксел и при перемещении менять позицию bevel на позицию высоты элемента над которым мышь - но как получить эту координату? А может я зря парюсь и есть готовый бесплатный компонент?
|
#2
|
||||
|
||||
Просто вручную перерисовывать, я так делал.
...сказал, и загрустил от бесспорной своей правоты |
#3
|
|||
|
|||
Перерисовывать в каком плане? вопрос был немного в другом - что при перетаскивании элемента появляется полоска показывающая куда элемент должен будет поместится при бросании его...
Ну и в догонку ещё один вопрос... если список не умещается и появляется полоса прокрутки вертикальная - то когда я перетаскиваю допустим первый элемент к низу списка я подвожу курсор к низу ListBox'a - а автоматической прокрутки списка дальше не происходит... приходится отпускать элемент, прокручивать ListBox, а затем дальше делать перетаскивание... Кто нить с этим боролся? |
#4
|
||||
|
||||
Такой вариант устроит?
Код:
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var i : Integer; rt : TRect; dc : Cardinal; begin if y <= 4 then istBox1.TopIndex := ListBox1.TopIndex - 1; if y >= ListBox1.Height - 4 then ListBox1.TopIndex := ListBox1.TopIndex + 1; i := ListBox1.ItemAtPos(Point(x,y), true); if ListBox1.Tag = i then exit; rt := ListBox1.ItemRect(ListBox1.Tag); InvalidateRect(ListBox1.Handle, @rt, true); ListBox1.Tag := i; rt := ListBox1.ItemRect(i); dc := GetDC(ListBox1.Handle); MoveToEx(dc, rt.Left, rt.Top + 1, nil); LineTo(dc, rt.Right, rt.Top + 1); ReleaseDC(ListBox1.Handle, dc); end; ...сказал, и загрустил от бесспорной своей правоты Последний раз редактировалось 0nni, 03.01.2009 в 00:29. |
#5
|
|||
|
|||
Хм похоже это то что надо - завтра поковыряю, спасибо!!! Но вот со вторым вопросом до сих пор засада!!!
|
#6
|
||||
|
||||
По второму вопросу, я вначале еще две строчки добавил.
...сказал, и загрустил от бесспорной своей правоты |
#7
|
|||
|
|||
Что ж, вроде тоже работает - опять же завтра доковыряю... МОжет и с последним вопросом поможеш? При перетаскивании файлов на форму я их добавляю в ListBox, это не сложно! но вот вытаскивать файлы из ListBox'a наоборот например на рабочий стол - это сложнее! Порывшись в нете я нашёл только один способ - это компонент TDropper. Работает он вроде неплохо, но тут проблемма вот в чем, нужно как то отследить перемещение мыши внутри ListBox'a и за его пределами... Т.е. пока мыш таскает запись внутри списка то тупа делаем Drag&Drop внутри компонента - а когда я вытаскиваю за пределы компонента и отпускаю допустим над рабочим столом - то тогда задействовать компонент Dropper. Но как отличить перемещение внутри и за пределами не знаю - не поможеш? А ещё лучше аськой не поделишся? Я бы поспрашал кое что
|
#8
|
||||
|
||||
416676939
TDropper? Помнится для этой цели тоже какой то компонент использовал, проблем не дыло. А вот ручками не делал. ...сказал, и загрустил от бесспорной своей правоты |