【问题标题】:How to make list view scroll while dragging an item up or down?如何在向上或向下拖动项目时使列表视图滚动?
【发布时间】:2012-09-16 23:14:55
【问题描述】:

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

PS:我也启用了 VCL 主题

【问题讨论】:

    标签: delphi listview drag-and-drop


    【解决方案1】:

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

    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;
    

    如果可以,您也可以合并水平滚动。

    【讨论】:

    • +1,谢谢,我还修改了它,以便通过设置计时器间隔将鼠标移离边缘越远,滚动速度越快。像魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 2021-07-17
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2014-11-15
    • 1970-01-01
    • 2022-12-20
    相关资源
    最近更新 更多