【问题标题】:TListBox - Selected Item Scroll SpeedTListBox - 选定项滚动速度
【发布时间】:2014-02-25 20:41:02
【问题描述】:

我需要更改列表框的速度在选择项目时滚动(按住鼠标左键),鼠标在列表框外移动。要复制该行为,请执行以下操作:

  1. 在表单上放置一个列表框(+- 250 x 200 奇数)。不要让它太大,否则滚动条在底部将不可见。
  2. 将列数设置为 3。
  3. 将以下代码添加到 FormCreate:

    var
      I: Integer;
    begin
      for I := 0 to 200 do
        ListBox1.Items.Add('Item '+IntToStr(I));
    end;
    
  4. 运行应用程序并确保底部的滚动条可见。现在在列表中的任何项目上单击并按住鼠标左键。移动鼠标,所选项目将根据鼠标光标下的项目而改变。问题是当鼠标移出列表框时,列表框会很快滚动,这在我的情况下是选择隐藏的项目所必需的。我正在尝试减慢滚动速度。

我了解这不是列表框的正常用法,并且该行为可能不完全符合标准 UI 指南。出于非常特定的目的需要它,问题是滚动速度让用户感到非常尴尬。

我已经使用拖放和计时器将一些东西放在一起,但这并不理想,因为控件周围的“命中”区域有点小。如果有一种开箱即用的方法,那就太好了。

【问题讨论】:

  • 我会学习用户滚动鼠标滚轮。它对 Windows 7 有很好的效果 :)
  • 不幸的是,滚轮在这种情况下不起作用。
  • 我在这里遗漏了什么吗?我认为您的目标是获取客户端矩形视图之外的项目。那是你可以通过滚轮滚动的地方......
  • 当我停止移动鼠标时,滚动停止。当再次移动而不释放按钮时,它会再次开始滚动。所以看起来控制滚动是可能的。无论如何,你不会发现任何开箱即用的东西。
  • “滚动条在底部” -> “在右边”?

标签: delphi listbox scroll


【解决方案1】:

下面的内容至少很尴尬。然而这是我唯一能想到的。使用插入器进行了演示,但您可以使用任何其他方式使用 ApplicationEvents 组件或子类。

type
  TListBox = class(stdctrls.TListBox)
  protected
    procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
  end;

procedure TListBox.WMMouseMove(var Message: TWMMouseMove);
begin
  if GetCapture = Handle then
    Sleep(250);
  inherited;
end;

【讨论】:

  • 我绝对可以以此为起点。吃鼠标移动消息是不好的做法吗?因此,如果我确定现在不是再次滚动的时间,并且此消息将导致滚动,那么我可以吃它而不是做一些像睡觉之类的事情吗?
  • @Gray - 为什么,不。吃饭肯定比等待好。
  • @Gray 令我惊讶的是,您更喜欢滚动条、键盘导航。等
  • @DavidHeffernan 这不是我喜欢它。我最近加入了这家公司。该软件已有 10 多年的历史。在那段时间里,人们已经习惯了该软件及其工作方式。将逻辑移到弹出表单上并不难,这可能是将来会做的事情。同时,添加过滤或其他功能来证明客户眼中的变化可能是有意义的。目前,计时器和消息处理程序更简单,需要更少的测试,并且不需要客户进行任何“学习”。只是现在更有意义(时间/奖励)。
猜你喜欢
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多