5

我正在使用TListView具有拖放功能的产品,可以将一个或多个项目拖放到另一个项目中,作为一种合并形式。当您将项目拖动到控件的顶部或底部时,我需要它自动向上或向下滚动,但它不会。这同样适用于在某些视图样式中向右或向左滚动。我怎样才能让它在用户拖动项目的方向上自动滚动?

PS:我也启用了 VCL 主题

4

1 回答 1

6

没有进行太多测试,但是下面的尝试在将项目拖动到其父项的控件之外(在示例中为表单)时启用计时器,并且计时器事件测试光标位置以找出是否有滚动消息应该发送到列表视图。

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := False;
  Timer1.Interval := 500;
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if Source = ListView1 then 
    Timer1.Enabled := True
  else
    Timer1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Pt: TPoint;
begin
  // Stop timer and exit if not dragging any more
  if not ListView1.Dragging then begin
    Timer1.Enabled := False;
    Exit;
  end;

  Pt := ListView1.ScreenToClient(Mouse.CursorPos);
  if Pt.Y < 0 then
    ListView1.Perform(WM_VSCROLL, SB_LINEUP, 0)
  else
    if Pt.Y > ListView1.ClientHeight then
      ListView1.Perform(WM_VSCROLL, SB_LINEDOWN, 0)
    else
      Timer1.Enabled := False;
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  Timer1.Enabled := False;
end;

如果它工作正常,您也可以合并水平滚动。

于 2012-09-17T00:22:41.267 回答