Пример реализации прокрутки для тач-интерфейса.

Обработка + внешняя компонента, которые позволяют добиться того, что так нужно любому тач-интерфейсу: прокрутки списков пальцем!

     Пример, который я хочу вам предложить, не претендует на новизну, свежий взгляд или самое красивое решение. Возможно, это даже очередной велосипед. Возможно, содержит ошибки, как логические, так и методические. Однако, на Инфостарте я не нашел обработки, которая помогла бы мне решить текущую задачу, а именно — нарисовать удобный тач интерфейс для моноблока с сенсорным экраном. Поэтому, как умел, сделал сам. Возможно, кому-то мой опыт покажется полезным.

    1С 8.2 и управляемые формы достаточно гибки (особенно вспоминая ужас работы с интерфейсом 7.7). В принципе, почти все, что нужно, они сделать позволяют. Можно и кнопки большие реализовать, и шрифт. Остается одна принципиальная задача, я бы даже сказал, вызов — это прокрутка пальцем. Как пользователь планшета, я не понимаю, зачем существует тач интерфейс, если нет возможности пользоваться руками. Однако, проблема в том, что в 1С нельзя подписаться на события «MouseDown» и «MouseUp», а так же нельзя получить координаты курсора мыши. Палец же с точки зрения тач-интерфейса — это мышь. Поэтому, чтобы получить возможность прокручивать список, данные задачи стоит передать внешней компоненте. 

Ок, данные от мыши получили. Встает следующая проблема 🙂 1С очень неловко (с точки зрения вмешательства) работает с табличным полем, которое привязано к динамическому списку. Нельзя ни получить общее количество строк, ни (в определенных случаях) получить номер текущей строки и увеличить его. Можно, конечно, пытаться как-нибудь выйти из положения с помощью скрытых колонок. Мне показалось, что лучшим вариантом будет «превратить» движения мыши вверх-вниз с зажатой кнопкой (= то есть движения пальца по экрану) в сообщения о прокрутке колеса мыши. 1С замечательно обрабатывает такие события без каких-либо ухищрений.

Итак, что представляет собой внешняя компонента?

Это dll по технологии NativeAPI, у которой есть 2 метода и 2 свойства.

Методы донельзя простые, это Включить() и Выключить()

Свойства тоже очевидны: Включен (чтение) и Активирован (чтение и запись).

Второе свойство служит для активации режима превращения MouseMove в MouseScroll.

С точки зрения Windows, компонента ставит глобальный хук на WH_MOUSE_LL. В случае активации блокирует сообщение WM_MOVE и шлет вместо него WM_MOUSEWHEEL.

Работа протестирована на УТ11 в средах Win7, WinXP, Win2003. Обработка умеет подключаться как дополнительная.

Компонента находится в макете обработки, приложенной к этой заметке. Сама обработка ничего толкового не делает — просто выводит список из 200 строк для тестирования прокрутки. 

Для работы компоненты могут понадобиться C++ Redistributable.

12.04.2013

Добавлено свойство «Чувствительность». Параметр влияет на скорость прокрутки (то есть на скорость посыла сообщения для скролла). При Ч. = 1 скролл работает «по умолчанию» с «обычной» скоростью. При увеличении Ч. скролл замедляется. Тип параметра = целое число.

P.S. Для корректной работы прокрутки необходимо у таблицы формы выставить следующие свойства:

Разрешить начало перетаскивания — Истина

Разрешить перетаскивание — Ложь

21 Comments

  1. Sholl

    Классная штука.

    +1

    Вопрос: можно ли убрать предупреждение: внешняя компонента успешно установлена?

    Reply ↓
  2. stanru1

    (1) обновил обработку, теперь почем зря предупреждение не выскакивает.

    Reply ↓
  3. yuraos

    (2)


    1С 8.2 и управляемые формы достаточно гибки (особенно вспоминая ужас работы с интерфейсом 7.7).

    И в чем именно этот «ужас» заключался ???

    Reply ↓
  4. stanru1

    (3) эти слова — не огульное обвинение 7.7, а беззлобное подтрунивание

    если серьезно, то в 7.7, например, формы надо было рисовать, расставляя элементы управления в нужном порядке. в 8.2 платформа сама их размещает. Не было в 7.7 динамических списков. Не было настоек условного оформления.

    Разумеется, владея formex можно было сделать многое, но в 8.2 это делать удобнее.

    Reply ↓
  5. yuraos

    (4)

    а … это ты про штатные возможности 1с-7.7.

    ну да, в 1с-7.7 интерфейсные возможности более чем скромны.

    сам использовал formex для их разнообразия.

    мне почему-то показалось

    что ты сравниваешь обычный интерфейс 1с-8.2 с управляемым

    и я сразу изготовился поднять тему

    о «кошмариках» управляемого приложения

    🙂

    Reply ↓
  6. yuraos

    stanru1,

    классный у тебя котяра!

    😉

    Reply ↓
  7. Hellgga

    (6) yuraos, Это вроде не котяра, а манул…

    Вот ещё один 🙂

    Reply ↓
  8. stanru1

    (6) yuraos, спасибо! Этот котяра был в подарках «контакта». Оттуда я его и уволок.

    (7) Hellgga, именно манул это и есть.

    Reply ↓
  9. yuraos

    (7) Hellgga, (8)

    Манул — это и есть «такой дыкый азыатский катяра»

    🙂

    Reply ↓
  10. Sholl

    А можно добавить свойство «Чувствительность»?

    Типа на сколько движений мыши будет один скролл.

    Или ограничение количества сколлов в секунду.

    Reply ↓
  11. stanru1

    (10) добавил свойство «Чувствительность». При Ч. = 1 скролл происходит «по умолчанию». При увеличении Ч. — замедляется.

    Reply ↓
  12. tdsk

    Выложите пожалуйста dll. Пытаюсь переписать на 8.1 и никак не могу вытащить ВК из обработки, винд 7 не хочет её регистрировать

    Reply ↓
  13. dindzilin

    Насколько помню, компоненты по технологии NativeAPI не нуждаются в регистрации в этом их фишка. А вот может ли 8.1 с ними работать — не уверен, по моему нет. Проще переписать на технологию COM.

    Reply ↓
  14. dindzilin

    Есть вопрос автору — есть идеи как реализовать то же самое только на табличном документе?

    Reply ↓
  15. LeaNaeD

    Присоединяюсь по поводу табличного документа. Но больше всего хотелось бы посмотреть рабочий пример сенсорной прокрутки самой формы или данных панели. Тыцкать пальцем за ползунок и тянуууууть — невеселое занятие это все.

    Reply ↓
  16. Edgar70

    Аналогично, вопрос по прокрутке формы… можно ли это реализовать? или хотябы кнопку которая эмулирует прокрутку колесом мышки?

    Reply ↓
  17. ParabolParabola

    Вообще не понятно как она работает. На Windows 8, что с этой обработкой, что без нее, ничего не меняется, справочники не листаются.

    Reply ↓
  18. Edgar70

    (17) ParabolParabola, Насчет журнала справочников не знаю, а вот динамические списки листает прекрасно и в win 7 и в win 8(.1)

    По сути, для прокрутки формы проблема заключается только в том, как активировать захват мышки без выделения какого либо элемента

    Reply ↓
  19. ParabolParabola

    На windovs server 2008, не регистрируется MouseEvents.dll, как можно зарегистрировать эту dll?

    Reply ↓
  20. Edgar70

    (19) ParabolParabola, Запустить от имени админа 1ску?

    (2) Возникла проблема на планшете — при частом пролистывании компонента подвисает 🙁

    и при активном открытии/закрытии форм может вылететь и больше не включиться… автор, подскажи плиз, как можно усовершенствовать? повысить стабильность? сверхнеобходимая штука! 🙂

    Reply ↓
  21. antoklio

    А на Windows 10 будет работать компонента?

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *