Как сбросить отметку выбора после того, как вы изменили выбор в TListView? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть TListView в виртуальном режиме, и когда я перетаскиваю элемент, я хочу переместить выделение в новую позицию элемента. Я делаю это, очищая выделение, а затем устанавливаю Selected выбранного элемента. Это нормально, но есть проблема. После этого, если я удерживаю Shift и щелкаю элемент (например, множественный выбор), список ведет себя так, как будто начало выбора - это элемент, который был выбран ранее, а не тот, который я выбрал (с Selected: = True).

Я пытался смоделировать щелчок, но после перемещения мыши я получаю нарушение прав доступа:

procedure TForm1.ListDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
 List.Perform(WM_LBUTTONDOWN, MK_LBUTTON, $002E001E);
 Sleep(10);
 List.Perform(WM_LBUTTONUP, 0, $002E001E);
end;

1 Ответ

0 голосов
/ 29 августа 2018

После выбора нового элемента, вы также должны установить его как сфокусированный. Но, что более важно, вам необходимо отправить ListView сообщение LVM_SETSELECTIONMARK:

Метка выбора - это индекс элемента, с которого начинается множественный выбор.

Например:

procedure TForm1.ListDragDrop(Sender, Source: TObject; X, Y: Integer);
var
  Item: TListItem;
begin
  ...
  Item := ...; // the list item after it has been moved to its new position...
  Item.Selected := True;
  Item.Focused := True;
  List.Perform(LVM_SETSELECTIONMARK, 0, Item.Index);
  List.Invalidate;
  ...
end;
...