我有一个将 DragMode 设置为的列表框,dmAutomatic
可以将项目的文本拖到其他地方。
我将多选设置为true
. 我希望能够单击并拖动我的列表框项目以按顺序选择多行。所以我有:
Shift := [ssLeft];
在ListBoxMouseDown
事件中。拖动多选不起作用。如果我在单击并拖动时物理地按住 shift 键,我会得到想要的结果。关于为什么或如何解决这个问题的任何建议?
你正在以错误的方式解决这个问题。根本不要使用DragMode=dmAutomatic
,它并不意味着您尝试使用它。相反,在OnMouseDown
事件中,当左键按下时设置一个标志。在OnMouseMove
事件中,如果设置了标志,则选择鼠标下的当前项目。在这种情况OnMouseUp
下,清除标志。例如:
var
Dragging: Boolean = False;
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
If Button = mbLeft then
Dragging := True;
end;
procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
If Button = mbLeft then
Dragging := False;
end;
procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
Index: Integer;
begin
If not Dragging then Exit;
Index := ListBox1.ItemAtPos(Point(X, Y), True): Integer;
If Index <> -1 then
ListBox1.Selected[Index] := True;
end;