拖动和MouseDown冲突

时间:2013-06-26 02:24:51

标签: delphi select listbox mouse

我有一个列表框,其DragMode设置为dmAutomatic,以便将项目的文本拖到别处。

我将Multiselect设置为true。我希望能够单击并拖动我的列表框项目以按顺序选择多行。所以我有:

Shift := [ssLeft];
ListBoxMouseDown事件中

。拖动多选不起作用。如果我在点击并拖动时按住shift键,我会得到所需的结果。关于为什么或如何解决这个问题的任何建议?

1 个答案:

答案 0 :(得分:0)

你这是错误的方式。根本不要使用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;