|
|
#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 |
|
Британский учённый
|
Цитата:
А с остальными перекрываю lookup и свою форму вызываю. Если не подходит, тогда опишите пожалуйста задачу подробнее, или лучше выложите код, может кому и пригодится. Хотя такими вещами в Аксапте мало кому приходится заниматься
|
|
|
|
|
#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 |
|
Участник
|
Цитата:
ActiveX есть штатный - Microsoft UpDown Control, только как его привязять к полю ввода, как сделать, чтобы он реагировал, когда в поле ввода нажимаются стрелки вверх/вниз, непонятно
|
|
|
|
|
#9 |
|
Участник
|
С моей точки зрения лучше сделать для этих целей отдельный абстрактный класс или интерфейс.
http://en.wikipedia.org/wiki/Model-view-controller Model-View-Controller в .Net |
|
|
|
|
#10 |
|
Участник
|
Цитата:
Может, я просто неточно выразился на счет "необходимо перекрыть"... Но он не является интерфейсом в чистом виде, потому что реализует основные функции, ради которых он создавался: инициализацию списка и его прокрутку при выборе новых элементов.PS. Подправил описание класса, чтобы было меньше двусмысленностей. Последний раз редактировалось gl00mie; 30.11.2006 в 11:59. |
|
|
|
|
#11 |
|
Участник
|
Тут акцент на слово "отдельный". Типа один класс для описания абстракуии коллекции объектов, а другой для показа этой абстракции в списке.
|
|
|
|
|
#12 |
|
Участник
|
Всё, конечно, здорово, но хотелось бы вернуться к исходному вопросу
Кто-нить прикручивал к полям ввода UpDown (Spin) Control? Или получалось у кого-нить отследить прокрутку Listbox'а? По поводу второго у меня надежд мало, потому что штатный виндовый Listbox, судя по описалову оконных сообщений, даже при работе через WinAPI о таких вещах не сообщает...
|
|
|
|
|
#13 |
|
Британский учённый
|
Вот посмотрите пожалуйста скрин
|
|
|
|
|
#14 |
|
Участник
|
|
|
|
|
|
#15 |
|
Британский учённый
|
ну это Spin прикрученный к StringEdit, Вы ведь вроде спрашивали как его можно прикрутить? Или я что то не так понял?
|
|
|
|
|
#16 |
|
Участник
|
Цитата:
В упор не вижу на приведенном скриншоте того, что я понимаю под "UpDown Control". На вскидку я вижу Group с FrameOptionButton = Check, IntEdit, StringEdit c ButtonImage = Arrow (по умолчанию), Grid, выпавшие в lookup'е два Listbox'а и предположительно CommandButton. Если обратиться к первоисточнику, то UpDown Control "has a pair of arrow buttons which the user can click to increment or decrement a value, such as a scroll position or a value in an associated control, known as a buddy control". Чесслово не вижу среди описанного Spin Control, "поднимите мне веки" ![]() PS. Можно на "ты", я не обижусь
|
|
|
|
|
#17 |
|
Британский учённый
|
Упс
, теперь понял. Подумал, что Вы желаете реализовать, что то типа прокручиваемого листбокса (как менюшки в Аксапте). Сорри , хотел помочь.
|
|
|
|
|
#18 |
|
Британский учённый
|
Как вариант в методе task прокручивать. Правда, если на форме только один контрол, например StringEdit, то task ArrowUp и ArrowDown не отрабатывают. Но вот если есть еще скажем грид (т.е. контрол по которому можно перемещаться вверх/вниз), тогда работает. Можно запоминать активный контрол и если активен нужный - листать.
|
|
|
|
|
|