Скроллинг в Browse

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
PIT

Скроллинг в Browse

Сообщение PIT »

Как получить {prop:XPos} для ScrollBara в колонке Browse?
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Скроллинг в Browse

Сообщение Andrew™ »

PIT писал(а):Как получить {prop:XPos} для ScrollBara в колонке Browse?
есть свойства PROP:VScrollPos и PROP:HScrollPos для LIST контрола
с помощью этих свойств можно вычислить всё что требуется
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Скроллинг в Browse

Сообщение Andrew™ »

PIT писал(а):Как получить {prop:XPos} для ScrollBara в колонке Browse?
честно говоря не понял вопроса

я понял так - определить Xpos области вертикальной прокрутки

если да, то очень просто, это кстати в примере по расчёту координат ячейки в LIST контроле присутсвует

с помощью Win API функции GetClientRect получаем размер клиентской области LIST контрола без учёта областей прокрутки

GetClientRect(Window $ ?List{PROP:Handle},tmp)
Искомая Xpos области прокрутки = Window $ ?List{PROP:Xpos} + tmp.Right
Искомая ширина области прокрутки = Window $ ?List{PROP:Width} - tmp.Right
Pit

Скроллинг в Browse

Сообщение Pit »

Прошу прощения, думал об одном, а писал прро другое.
Действительно, разговор идет о ScrollBar'e на поле (колонке) Browse.
Нужно получить PROP:HScrollPos для оного. Для List'a это просто, а для поля в List'e - проблема!!!
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Скроллинг в Browse

Сообщение Andrew™ »

Pit писал(а):Прошу прощения, думал об одном, а писал прро другое.
Действительно, разговор идет о ScrollBar'e на поле (колонке) Browse.
Нужно получить PROP:HScrollPos для оного. Для List'a это просто, а для поля в List'e - проблема!!!
совсем ничего не понял, пример расчёта координат ячейки я выложил,
если это не то, Тогда что надо то? что за поле в LIST'е?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сообщение Дед Пахом »

Имеется в виду ГОРИЗОНТАЛЬНЫЙ SCROLLBAR для отдельной колонки листбокса и, соответственно, его HScrollPos.
С уважением, ДП
PIT

Скроллинг в Browse

Сообщение PIT »

Дед Пахом понял верно :!:
softcreator
Ветеран движения
Сообщения: 78
Зарегистрирован: 04 Август 2005, 9:35
Контактная информация:

Сообщение softcreator »

Узнать смещение некого скрулл-бара не проблема - ловим WM_HSCROLL и в нем используя GetScrollInfo получаем это самое смещение. Но вот как узнать хендл окна ScrollBar-а, связанного с неким произвольным полем (а таких скуллируемых полей может быть в списке произвольное число) - тут очевидного и гарантирующего ответа я не знаю. Навскиду можно попробовать определять позицию мыши в процессе скруллинга - известно наличие общего скрулла - т.е. можно определить смещение относительно низа списка, где начинается скрулл поля - и зная положение полей можно определить ПОД каким полем жмется мыша в процессе скруллинга.
PIT

Скроллинг в Browse

Сообщение PIT »

Вообще задачка такая:
Мне нужно скроллировать это поле в колонке с помощью клавы (вправо-влево) и одновременно выполнять то же самое в параллельном List'e.
Проще - имеется 3 лист-бокса
- основной - справа внизу
- горизонтальный (вспомогательный) - справа вверху
- вертикальный - слева
При вертикальной прокрутке в основном листе прокручивается левый лист-бокс
При горизонтальной прокрутке в основном листе (вправо-влево) прокручивается верхний лист-бокс
Во всех трех одно поле в виде текстовой строки длиной до 1000 при ограниченной ширине окна.
Мышкой в основном листе прокрутка за скролл-бар выполняется, а вот с помощью клавы да еще и протащить в верхнем окне не выходит без PROP:HScrollPos
softcreator
Ветеран движения
Сообщения: 78
Зарегистрирован: 04 Август 2005, 9:35
Контактная информация:

Сообщение softcreator »

Госсыди... я-то думал там серьезная задача (решение которой мне самому нужно, в принципе) :)
Возьми мои шаблоны - там в control-шаблоне "Просмотр текстового (ASCII) файла" реализован скруллинг одного большого поля кнопками клавы.
Гость

Сообщение Гость »

softcreator писал(а):Госсыди... я-то думал там серьезная задача (решение которой мне самому нужно, в принципе) :)
Возьми мои шаблоны - там в control-шаблоне "Просмотр текстового (ASCII) файла" реализован скруллинг одного большого поля кнопками клавы.
Все это хорошо, спасибо за совет!
Но!!! Получается странный скроллинг - шаг 10, всего 100.
За 10 нажатий скролл-бар смещается до конца, а текст только на 10 знаков.
Если я жму мышкой на правую стрелку скролл-бара, текст смешается на столько, на сколько мне надо (то же колесиком мышки).
В чем собака порылась??? Где искать?
softcreator
Ветеран движения
Сообщения: 78
Зарегистрирован: 04 Август 2005, 9:35
Контактная информация:

Сообщение softcreator »

Ну это "особенности реализации" - точнее обмана RTL :-)
А универсальный способ для списка с одним полем довольно прост
1. Калбечим оконную процедуру, обрабатываем все же не WM_HSCROLL, а WM_CTLCOLORSCROLLBAR
2. В нем получаем, используя GetScrollInfo, позицию ползунка и используем ее по своему усмотрению.
3. Если нужно перемещение ползунка клавиатурой - используем функцию SetScrollInfo (алерты на LeftKey и RightKey - и отрабатываем перемещение руками).
Единственный момент - необходимо знать хендл окна-скрулла. Но тут помогает специфика сообщения WM_CTLCOLORSCROLLBAR - оно вызывается при прорисовке скрулла - в том числе и при открытии окна. Т.е. поскольку мы сабклассим свои известные списки - то при открытии окна и получении в оконных процедурах события WM_CTLCOLORSCROLLBAR всеми процедурами, где есть списки с скруллами, мы "фиксируем" у себя в переменных хендлы всех scroll-bar-окон и пользуемся ими для позиционирования ползунков в произвольное время.
Так что все довольно тривиально...
softcreator
Ветеран движения
Сообщения: 78
Зарегистрирован: 04 Август 2005, 9:35
Контактная информация:

Сообщение softcreator »

Погорячился я в предыдущем посте - легко делается перемещение ползунков - а вот заставить скруллиться сам список синхронно перемещению ползунка у меня не получилось :cry:
PIT
Посетитель
Сообщения: 49
Зарегистрирован: 18 Август 2005, 10:16
Откуда: Пермь
Контактная информация:

Скроллинг в Browse

Сообщение PIT »

softcreator писал(а):Погорячился я в предыдущем посте - легко делается перемещение ползунков - а вот заставить скруллиться сам список синхронно перемещению ползунка у меня не получилось :cry:
Работает только в 6.1. Синхронно в 2х лист'ах. В 5.5 никак.
С уважением, П.Ялунин (PIT)
Ответить