Было: иконки сортировки, нажатие на заголовок

Обсуждение MAV Direct ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Было: иконки сортировки, нажатие на заголовок

Сообщение StillZero »

Было: некорректно определяется ширина заголовка столбца, если этот столбец содержит иконку. Соответственно несколько криво отрабатывает отрисовка нажатия на заголовок.

Решение:
- используем Prop:Edit, в динамике создаем Entry-контрол
- определяем размеры этого Entry-контрола через GetWindowRect
- действительные координаты можно вычислить учитывая положение окна, на котором находится ListBox

Т.е., насколько я понимаю, вся разница с предыдущим методом - это использование GetWindowRect, а не Prop:Xpos, Prop:Width etc

Ниже код, для определения "левой" и "правой" координат колонки, я думаю, что названия переменных понятны:

Код: Выделить всё

xHdrClass.GetColumnLeftPos PROCEDURE(LONG inColumn)
loc:EntryControl LONG              ! eip entry поле
loc:Rect         LIKE(xhdr_RECT)   ! прямоугольник
loc:RetValue     LONG              ! возвращаемая Xpos координата колонки
 code
 loc:RetValue = 0

 loop col# = (inColumn-1) to 1 by -1  ! ищем колонку левее указанной
    LastOnLine# = SELF.ListBoxFEQ{PROPLIST:LastOnLine,col#}
    if NOT LastOnLine# then break.
 end

 if NOT col#                          ! не нашли колонку - т.е. левее нет колонки
    if xhdr_GetWindowRect(SELF.ListBoxFEQ{Prop:Handle},address(loc:Rect))
       loc:RetValue = loc:Rect.left
    end
 else
    loc:EntryControl = CREATE(0,CREATE:Entry)
    SELF.ListBoxFEQ{Prop:Edit,col#} = loc:EntryControl
    if xhdr_GetWindowRect(loc:EntryControl{Prop:Handle},address(loc:Rect))
       loc:RetValue = loc:Rect.right
    end
    SELF.ListBoxFEQ{Prop:Edit,col#} = 0
    DESTROY(loc:EntryControl)
 end

 return loc:RetValue

Код: Выделить всё

xHdrClass.GetColumnRightPos PROCEDURE(LONG inColumn)
loc:EntryControl LONG
loc:Rect         LIKE(xhdr_RECT)
loc:RetValue     LONG
 code
 loc:RetValue = 0
 loc:EntryControl = CREATE(0,CREATE:Entry)
 SELF.ListBoxFEQ{Prop:Edit,inColumn} = loc:EntryControl
 if xhdr_GetWindowRect(loc:EntryControl{Prop:Handle},address(loc:Rect))
    loc:RetValue = loc:Rect.right
 end
 SELF.ListBoxFEQ{Prop:Edit,inColumn} = 0
 DESTROY(loc:EntryControl)

 return loc:RetValue
Надеюсь чем нибудь это поможет
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Было: иконки сортировки, нажатие на заголовок

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

StillZero писал(а): Надеюсь чем нибудь это поможет
дык, я именно так и делал, вычислял размер ширины и положение столбца именно через PROP:Edit, но когда имеет место быть иконка, естественно область иконки не редактируется и потому был отступ на размер области иконки, я конечно проверю вышепредложенный код.

если я не очень понятно изложил суть, проверь следующее:

сделай LIST с колонкой где есть иконка, выстави у любой имеющейся строки PROP:Edit, и увидишь что вводное поле не занимает всю ячейку
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Сообщение StillZero »

я в курсе насчет того, что PROP:Edit при наличии иконки занимает "ширину колонки - ширину под икону", поэтому для x-координаты смотрим положение колонки "левее необходимой нам", а не самой искомой колонки, т.е. участвуют в поисках :) две колонки
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Сообщение StillZero »

...вообщем, по итогу... этого способа все равно не хватает для точного определения x-координаты и ширины колонки... :(
softcreator
Ветеран движения
Сообщения: 78
Зарегистрирован: 04 Август 2005, 9:35
Контактная информация:

Сообщение softcreator »

Позволю себе вмешаться в дискуссию корифеев - но определение начальной позиции и реальной ширины колонки при любом раскладе (наличие иконки, колонка в группе, наличие скрулбара) вполне решаемо и без создания доп.контролов - если использовать принцип анализа ширины колонки начиная с первой видимой и до интересующей.
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Флейм! Код в студию!
Без ?List{PROPLIST:Xpos,10} (нет такого пропа)
не определишь четко X начало для кажого столбца.
Четкойть должна быть до пикселя...
+ может быть сложная группа и т.д.
softcreator
Ветеран движения
Сообщения: 78
Зарегистрирован: 04 Август 2005, 9:35
Контактная информация:

Сообщение softcreator »

Код - это 120 кил сырцов класса кастомайзера заголовков ListBox-ов.
Не жирно будет? :D
А просто пример программы где будут сортироваться ЛЮБЫЕ колонки (в группе или вне ее, заголовок группы, скруллы на списке, скрулл на поле - что еще забыл?) нажатием на загловке и выводиться иконки и прочая мутота - сколько угодно. :wink:
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

2MAV: Андрей ... я тоже хочу что бы у нас все было тип топ!
Или как минимум чтобы текущий вариант сортировок отключался в шаблоне. Мне достаточно сортировки прост по нажатию. А в качестве визуального подтверждения будет изменившееся содержимое листбокса. Для отображения столбца и порядка мне достаточно значка [-] и [+] за текстом хидера!

Вот так вот... :)

P.S. Может тебе с Вадимом пообщаться приватно!? :)
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Сообщение StillZero »

2 Андрей: попробуй такую штуку - если есть икона у колонки отрубить ее, а потом опять включить, остальной код, я так понимаю, переделывать вообще не надо :)

примерно так:

Код: Выделить всё

 SavedIcon# = ?List1{PROPLIST:Icon,1}
 ?List1{PROPLIST:Icon,1} = FALSE
 EntryControl# = CREATE(0,CREATE:Entry)
 ?List1{Prop:Edit,1} = EntryControl#
 if xhdr_GetWindowRect(EntryControl#{Prop:Handle},address(loc:Rect))
    !loc:Rect.right
 end
 ?List1{Prop:Edit,1} = 0
 DESTROY(EntryControl#)
 ?List1{PROPLIST:Icon,1} = SavedIcon#
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

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

StillZero писал(а):я в курсе насчет того, что PROP:Edit при наличии иконки занимает "ширину колонки - ширину под икону", поэтому для x-координаты смотрим положение колонки "левее необходимой нам", а не самой искомой колонки, т.е. участвуют в поисках :) две колонки
реализовал, теперь заголовки в колонках которых присутсвует Tree или иконка "топчутся" правильно
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

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

Andrew Myalin писал(а):
StillZero писал(а):я в курсе насчет того, что PROP:Edit при наличии иконки занимает "ширину колонки - ширину под икону", поэтому для x-координаты смотрим положение колонки "левее необходимой нам", а не самой искомой колонки, т.е. участвуют в поисках :) две колонки
реализовал, теперь заголовки в колонках которых присутсвует Tree или иконка "топчутся" правильно
был глючок при расчёте ширины первой колонки, хорошо видно если List на близко у левого края окна

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

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

Andrew Myalin писал(а):
Andrew Myalin писал(а):
StillZero писал(а):я в курсе насчет того, что PROP:Edit при наличии иконки занимает "ширину колонки - ширину под икону", поэтому для x-координаты смотрим положение колонки "левее необходимой нам", а не самой искомой колонки, т.е. участвуют в поисках :) две колонки
реализовал, теперь заголовки в колонках которых присутсвует Tree или иконка "топчутся" правильно
был глючок при расчёте ширины первой колонки, хорошо видно если List на близко у левого края окна

исправлено
забыл, а точнее вылетела из головы одна засада, колонка слева так сказать может оказаться в той же колонке - LastOnLine, но данный атрибут игнорируется при отсутсвии группы, т е закладываться читсто на PROPLIST:LastOnLine не приходится. Подрихтовал библиотеку на данный атрибут, но анализ расчёта какая колонка реально стоит слева от нажатой другой.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Нажимаем на заголовки любой сложности

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

Вааще отказался при расчёте местоположения заголовка колонки от PROP:Edit, перешёл на обычный расчёт с калькуляцией всего заголовка LIST контрола, в результате теперь можно "топтать" и отображать сортировку в заголовках любой сложности, с наличием груп, LastOnLine полей и т д. В связи с тем что появилась стопудовое решение предполагается встроить в библиотеку динамический конструктор форматов для Browse.
Ответить