2014-02-25 57 views
4

我需要改变列表框被滚动的速度,当一个项目被选中(按住鼠标左键)并且鼠标移动到列表框外。要复制该行为,请执行以下操作:TListBox - 选定的项目滚动速度

  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准则。这是需要一个非常特定的目的,问题是滚动速度使用户非常尴尬。

我把东西放在一起使用拖放和计时器,但这并不理想,因为控制周围的“命中”区域有点小。如果有一种开箱即用的方式,那将会很不错。

+0

我会学习用户滚动鼠标滚轮。它在Windows 7上有很好的效果:) – TLama

+0

不幸的是,在这种情况下,滚轮不起作用。 – Graymatter

+0

当我停止移动鼠标时,滚动停在这里。在不释放按钮的情况下再次移动时,它会再次开始滚动。所以看起来好像有可能控制滚动。无论如何,你不会找到任何开箱即用的东西。 –

回答

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; 
+0

我完全可以以此为出发点。吃鼠标移动信息是不好的做法吗?所以,如果我确定现在不再滚动时间,并且这个消息会导致滚动,那么我可以吃它而不是做一些睡眠之类的事情吗? – Graymatter

+0

@格雷 - 为什么,没有。吃饭肯定比等待更好。 –

+0

@格雷它令我感到惊讶,你更喜欢这个滚动条,键盘导航。等等 –