Одним из таких решений может быть использование TListBox.ChildrenCount-1
и проверка, является ли Position.Y
меньше TListBox.Parent.Height + TListBoxItem.height
. Кроме того, создайте глобальную переменную boolean
, например «MouseIsDown».
Поскольку каждый элемент в TListBox на самом деле является дочерним объектом, с которым вы можете работать и изменять напрямую, просто создайте большой пустой TListBoxItem
и убедитесь, что он установлен как последний объект в списке.
В OnMouseDown
установите MouseIsDown
в True, а в OnMouseUp
установите в false.
Добавьте TFloatAnimation
в TListBox со свойством интерполяции, установленным на itElastic
или itBounce
. Если для MouseIsDown
установлено значение false, отключите этот эффект, а для MouseIsDown
установите значение true, включите эффект. Вам нужно будет проделать некоторую работу, чтобы сбросить позицию списка до последнего действительного объекта. Возможно, сделайте это в OnFinish
событии самой анимации.
Более подходящим было бы рассчитать положение этого последнего объекта и установить StopValue
анимации на это значение.
По сути, вам необходимо проверить, совпадают ли координаты последнего действительного объекта (т.е. не большого пустого объекта) в списке с высотой списка. Если они это сделают, а мышь не нажата, то анимация включена, и прокручиваемая коробка отскакивает. Если они совпадают, а мышь не работает, анимация отключается, и, таким образом, OnFinish
даже не будет запущен, и поэтому поле прокрутки не будет сбрасывать свою позицию.
Вероятно, вам потребуется выполнить итеративную вложенную процедуру, чтобы проверить, что каждое значение истинно.
Это не будет так гладко, как реализация iOS, но должно дать вам кое-что для работы.