2008-10-10 3 views
2

У меня есть TListBox с multiselect и ExtendedSelect, оба установлены в true. Мне нужно перетащить несколько элементов в поле списка, чтобы переустановить их. Моя проблема заключается в том, что происходит, когда пользователь нажимает на элемент, который уже выбран, не удерживая клавишу CTRL или SHIFT.Проблемы с перетаскиванием TListBox с включенным MultiSelect

Корпус 1: DragMode установлен в dmManual Выбор очищается до мыши. Это не позволит перетаскивать несколько элементов.

Случай 2: DragMode установлен в dmAutomatic Событие MouseDown никогда не срабатывает. Выбор не очищается, поэтому перетаскивание в порядке, но пользователь не может удалить выделение, нажав на один из выбранных элементов. Это действительно вызывает проблему, если все элементы выбраны или следующий элемент, который пользователь хочет выбрать, является частью текущего выбора.

Обратите внимание, что эта проблема возникает только в том случае, если вы назначили что-то для объекта DragObject в процедуре OnStartDrag. Я думаю, что проблема исчезнет, ​​если OnStartDrag начнется только после того, как пользователь переместит мышь. У меня есть Mouse.DragImmediate: = false set, но я все равно запускаю StartDrag, как только я нажимаю на элемент в списке.

Я использую Delphi 7 для этого проекта, но я вижу такое же поведение в Delphi 2007.

ответ

0

Я не уверен, почему это имеет значение, но если я изменяю DragObject как TDrag Control ObjectEx (вместо TDragObjectEx), я получаю поведение, которое я ищу. Режим перетаскивания - Автоматически.

Я попытался посмотреть и посмотреть, что это влияет, но я не мог понять это.

0

я играл с этим на некоторое время. И наблюдайте те же самые эффекты.

Я бы использовал Case2 и добавил (выберите все/Отменить все) в список. Он даже добавляет дополнительную функциональность и решает самую неприятную часть проблемы.

0

Используйте случай 2, и когда событие TListBox.OnMouseUp запускает проверку, проверяют, были ли выбраны и перетаскивались ли несколько элементов. Если выбрано несколько элементов, но не перетаскиваются, отмените выбор всех элементов, кроме щелчка.

Я использовал бы этот метод, потому что Windows Explorer работает таким образом.

0

Немного храма, но это работает. DragMode в ListBox установлен на dmAutomatic.

procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer); 
var 
    iDropIdx, i: Integer; 
    pDropPoint: TPoint; 
    slSelected: TStrings; 
begin 
    {Which item is being dropped onto?} 
    pDropPoint := Point(X, Y); 
    iDropIdx := ListBox1.ItemAtPos(pDropPoint, False); 

    slSelected := TStringList.Create; 
    try 
    {Copy the selected items to another string list} 
    for i := 0 to Pred(ListBox1.Items.Count) do 
    begin 
     if (ListBox1.Selected[i]) then 
     slSelected.Append(ListBox1.Items[i]); 
    end; 

    {Find the selected items in the listbox and swap them with the drop target} 
    for i := 0 to Pred(slSelected.Count) do 
    begin 
     ListBox1.Items.Exchange(ListBox1.Items.IndexOf(slSelected[i]), iDropIdx); 
     inc(iDropIdx); 
    end; 
    finally 
    slSelected.Free; 
    end; 
end; 
Смежные вопросы