![]() |
#1 |
Участник
|
Listbox - отследить прокрутку (scroll), или как прикрутить UpDown (Spin) Control
Я сейчас пытаюсь сделать поле ввода, значения в котором можно было бы менять, используя "стрелки", как у UpDown (Spin) или даже DomainUpDown Control. Пока что получилось реализовать это на основе "бесконечного" Listbox. В него при инициализации заносятся нужные значения, скажем, десяток элементов из "вычисляемого" списка, и выбор позиционируется посередине. Если же выбрать элемент ниже/выше текущего выбранного, то список "прокручивается" (строки удаляются/добавляются), и новый выбранный элемент опять позиционируется в середине списка, т.е. сверху и снизу от него получается примерно равное число строк. Если высоту такого списка задать равной высоте одной строки, то вместо scrollbar'а у него появляются кнопки со стрелками - как раз как у Spin Control. Но при этом отсутствует возоможность выбирать значения мышкой, щелкая только по этим кнопкам: прокрутка работает, но выбранным остается старое значение, пока по новому не щелкнешь мышой.
Так вот, как можно отследить, что пользователь прокручивает Listbox? Или как прикрутить к обычному полю ввода (String/Date/RealEdit) Spin Control? P.S. Если кому интересно, что у меня получилось в плане "бесконечных" списков, могу выложить пример. |
|
![]() |
#2 |
Участник
|
Зачем вам SPIN?
Сделайте рядом 2 кнопки и контролируйте EDIT. |
|
![]() |
#3 |
Британский учённый
|
Цитата:
![]() ![]() |
|
![]() |
#4 |
Участник
|
|
|
![]() |
#5 |
Участник
|
Цитата:
![]() |
|
![]() |
#6 |
Участник
|
Думаю можно повесить Hook какой...
Или ActiveX... тогда можно сделать полный SPIN-control |
|
![]() |
#7 |
Участник
|
Класс, реализующий "бесконечный" прокручиваемый Listbox
Во вложении - пара классов для создания "бесконечного" Listbox'а: собственно, абстрактный класс, реализующий функциональность прокрутки, и класс-наследник, приведенный в качестве примера. Конструктору в параметрах передаются: ссылка на FormListboxControl (предполагается, что control принадлежит какой-то форме), число элементов (не менее трех), которые надо поддерживать в списке, и начальное значение, связанное с элементом, который будет выбран при инициализации Listbox, т.е. на который будет указывать selection().
X++: void new(FormListBoxControl _formListbox, int _maxItems, anytype _startValue)
X++: Types getValueType(); anytype calcNextValue(anytype _currentValue, boolean _next); str fmtListValue(anytype _value); int calcSelectionDelta(anytype _from, anytype _to); В примере используется дополнительный BaseEnum и одна дополнительная метка. Последний раз редактировалось gl00mie; 30.11.2006 в 11:57. Причина: замечания belugin |
|
|
За это сообщение автора поблагодарили: belugin (10). |
![]() |
#8 |
Участник
|
Цитата:
![]() ![]() |
|
![]() |
#9 |
Участник
|
С моей точки зрения лучше сделать для этих целей отдельный абстрактный класс или интерфейс.
http://en.wikipedia.org/wiki/Model-view-controller Model-View-Controller в .Net |
|
![]() |
#10 |
Участник
|
Цитата:
![]() PS. Подправил описание класса, чтобы было меньше двусмысленностей. Последний раз редактировалось gl00mie; 30.11.2006 в 11:59. |
|
![]() |
#11 |
Участник
|
Тут акцент на слово "отдельный". Типа один класс для описания абстракуии коллекции объектов, а другой для показа этой абстракции в списке.
|
|
![]() |
#12 |
Участник
|
Всё, конечно, здорово, но хотелось бы вернуться к исходному вопросу
![]() |
|
![]() |
#13 |
Британский учённый
|
![]()
Вот посмотрите пожалуйста скрин
|
|
![]() |
#14 |
Участник
|
|
|
![]() |
#15 |
Британский учённый
|
![]() |
|
![]() |
#16 |
Участник
|
Цитата:
![]() ![]() PS. Можно на "ты", я не обижусь ![]() |
|
![]() |
#17 |
Британский учённый
|
Упс
![]() ![]() |
|
![]() |
#18 |
Британский учённый
|
Как вариант в методе task прокручивать. Правда, если на форме только один контрол, например StringEdit, то task ArrowUp и ArrowDown не отрабатывают. Но вот если есть еще скажем грид (т.е. контрол по которому можно перемещаться вверх/вниз), тогда работает. Можно запоминать активный контрол и если активен нужный - листать.
|
|
|
|