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

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

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

    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 не будет опубликован. Обязательные поля помечены *