Вверх ↑
Этот топик читают: Гость
Ответов: 2193
Рейтинг: 673
#31: 2014-07-09 19:08:14 ЛС | профиль | цитата
nesco, а попробуйте вместо HDN_ITEMCHANGED, отпускание сплитера заголовка HDN_ENDTRACKW (код = -327). Будет событие при изменении размера столбца курсором только после отпускания кнопки мыши.

карма: 10

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#32: 2014-07-09 23:26:39 ЛС | профиль | цитата
sla8a писал(а):
Будет событие при изменении размера столбца курсором только после отпускания кнопки мыши

Проверил. Действительно, срабатывает только на отпускание мыша, а если устанавливать ширину програмно, то не срабатывает. Хорошо, а если установили програмно, то такое событие не нужно
карма: 22

0
Ответов: 2193
Рейтинг: 673
#33: 2014-07-09 23:38:35 ЛС | профиль | цитата
sla8a писал(а):
если установили програмно, то такое событие не нужно
Думаю что нет в нем надобности.
карма: 10

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#34: 2014-07-09 23:51:03 ЛС | профиль | цитата
Но есть один недостаток этого метода -- ширина столбца выдается предыдущая. Те ширина гарантированно меняется только после HDN_ITEMCHANGED. Увы, но событие HDN_ENDTRACK не пойдет
карма: 22

0
Ответов: 2193
Рейтинг: 673
#35: 2014-07-10 00:01:38 ЛС | профиль | цитата
nesco писал(а):
Увы, но метод HDN_ENDTRACK не пойдет
Сейчас посмотрю, у меня выдавало ширину.
карма: 10

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#36: 2014-07-10 00:06:13 ЛС | профиль | цитата
sla8a писал(а):
у меня выдавало ширину

Предыдущую. Я проверил -- событие HDN_ENDTRACK выдается перед HDN_ITEMCHANGED. Но я влепил тригер на это событие, и дело сдвинулось
карма: 22

0
Ответов: 2193
Рейтинг: 673
#37: 2014-07-10 00:20:28 ЛС | профиль | цитата
Вот так можно ширину получить при HDN_ENDTRACK:
#pas
type
...
PHDNotify = ^HD_NOTIFY;
PNMHEADER = ^tagNMHEADERA;
...
HDN_ENDTRACK : begin
_debug(PHDNotify(PNMHEADER(Msg.LParam))^.pItem^.cxy);
end;
Правда два раза, первый старое, второй раз новое значение. ------------ Дoбавленo в 00.20:
sla8a писал(а):
Правда два раза, первый старое, второй раз новое значение
, а не все нормально, это debug мутит, а на событие один раз.
карма: 10

1
Голосовали:nesco
Разработчик
Ответов: 26061
Рейтинг: 2120
#38: 2014-07-10 00:50:51 ЛС | профиль | цитата
Только остался один маленький недостаток -- свойство таблицы LVColWidth примет это значение ширины только после HDN_ENDTRACK, перед HDN_ITEMCHANGED. Да и для чего вообще нужно событие ChangeWidth, я до конца и не понял
карма: 22

0
Ответов: 2193
Рейтинг: 673
#39: 2014-07-10 01:14:13 ЛС | профиль | цитата
nesco писал(а):
Да и для чего вообще нужно событие ChangeWidth, я до конца и не понял
А вместе с событием HDN_ITEMCHANGINGW ничто не помешает разработчику сделать многоуровневый заголовок.
На подобии вот этого: code_33963.txt
карма: 10

0
файлы: 1code_33963.txt [745B] [421]
Разработчик
Ответов: 26061
Рейтинг: 2120
#40: 2014-07-10 01:29:28 ЛС | профиль | цитата
sla8a писал(а):
А вмести с событием HDN_ITEMCHANGINGW ничто не помешает разработчику сделать многоуровневый заголовок

Пока я не совсем в это въехал. Но вот последние изменения таблицы, попробуй на ней реализовать то, что ты написал -- himtstrtbl_001.zip
карма: 22

0
файлы: 1himtstrtbl_001.zip [11.2KB] [330]
Ответов: 2193
Рейтинг: 673
#41: 2014-07-10 02:03:56 ЛС | профиль | цитата
По этой схеме будет думаю понятно о чем речь: code_33965.txt
Измените размеры столбцов и кнопки (имитирующие верхний ряд заголовка) подстроятся. Приделать сплитер к кнопкам тоже вроде не сложно.
На данный момент недостатки:
Нет события на двойной клик по сплитеру заголовка. И нет события на сдвиг горизонтальной полосы прокрутки. Но все это тоже можно добавить.
карма: 10

0
файлы: 1code_33965.txt [3KB] [452]
Разработчик
Ответов: 26061
Рейтинг: 2120
#42: 2014-07-10 02:20:06 ЛС | профиль | цитата
sla8a писал(а):
По этой схеме будет думаю понятно о чем речь

Понятно. Но причем здесь HDN_ITEMCHANGINGW
карма: 22

0
Ответов: 2193
Рейтинг: 673
#43: 2014-07-10 02:34:14 ЛС | профиль | цитата
nesco, могу ошибиться, но вроде как HDN_ITEMCHANGINGW происходит как onMouseMove, а HDN_ENDTRACK как onMouseUp. HDN_ITEMCHANGINGW, должен сообщать что пользователь изменяет ширину столбцов, а уже программно по этому событию подгонять свой дополнительный заголовок. К примеру сверху таблицы устанавливается PaintBox и на нем рисуется все необходимое. Или же подгонять обычные интерфейсные элементы, как на примере выше.
Так же для этих целей нужен HDN_DIVIDERDBLCLICKW (код -325) двойной клик по сплитеру заголовка. После этого действия ширина столбца уменьшается, тоже желательно событие после этого сообщения.
карма: 10

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#44: 2014-07-10 03:00:37 ЛС | профиль | цитата
sla8a писал(а):
но вроде как HDN_ITEMCHANGINGW происходит как onMouseMove

и как это вяжется вот с этим
sla8a писал(а):
HDN_ITEMCHANGINGW, должен сообщать что пользователь изменяет ширину столбцов


Как связаны MouseMove и изменение ширины столбцов
------------ Дoбавленo в 02.58:
Короче, никакой MouseMove не происходит при HDN_ITEMCHANGING. Он работает точно так же, как и HDN_ITEMCHANGED, только выдает значение перед изменением
------------ Дoбавленo в 03.00:
sla8a писал(а):
Так же для этих целей нужен HDN_DIVIDERDBLCLICKW (код -325) двойной клик по сплитеру заголовка

И как это совместить с запретом изменения ширины столбцов Хотя, можно попытаться разделить события и запретить выдачу события наружу при запрете изменения ширины.

Ладно, завтра подумаю. Но я бы все-таки отказался от сообщения HDN_ENDTRACK и использовал бы его только как триггер для сообщения HDN_ITEMCHANGED, те выдавать событие наружу после уже гарантированного изменения ширины.
карма: 22

0
Ответов: 2193
Рейтинг: 673
#45: 2014-07-10 19:50:31 ЛС | профиль | цитата
nesco писал(а):
Короче, никакой MouseMove не происходит при HDN_ITEMCHANGING. Он работает точно так же, как и HDN_ITEMCHANGED, только выдает значение перед изменением
У меня тоже не происходит, а вот за других не ручаюсь. Думаю вы должны знать почему не происходит, просто забыли.
Вставляем такой код:
#pas
WM_NOTIFY:
case HD_NOTIFY(Pointer(Msg.LParam)^).Hdr.code of
-320 : begin
dtInteger(di, PHDNotify(PNMHEADER(Msg.LParam))^.pItem^.cxy);
_hi_onEvent_(_event_onClick, di);
end;
и тестируем на такой схеме:code_33980.txt и сколько сплитер заголовка не двигать события не происходят, только при отпускании.
По умолчанию в винде эти события все же происходят. Эту у нас с вами они отключены. У меня XP и включить их могу так: Нажимаю клавиши Win+PauseBreak, а дальше по картинки:
win_setting.png
После нажатия клавиши применить, события сыпятся как при MouseMove.   nesco, вы бы не брезговали и подсматривали в мои каракули из этой темы: MTStrTbl дополнение, вот вам для удобства pas файл из этой темы: himtstrtbl_test_sla8a.zip
У меня ведь получилось заблокировать изменения ширины столбцов и даже отображение курсора над сплитером удалось убрать.
  Если у вас получится обнаружить событие при сдвиге вертикального скролла (когда ширина всех столбцов больше ширины компонента), то можно будет попробовать сделать отдельный элемент для создания собственных заголовков столбцов.
карма: 10

0
файлы: 3win_setting.png [31.5KB] [487], himtstrtbl_test_sla8a.zip [13.6KB] [274], code_33980.txt [288B] [260]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)