Форум: "KOL";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];
ВнизListView и EditBox - как? Найти похожие ветки
← →
Rusya (2007-10-10 11:20) [0]Hello all,
У меня на форме ecmListView и поле KOLEditBox. Как сделать так, чтобы при изменении ширины одного из столбцов списка автоматически изменялась ширина editbox"a?
← →
Rusya (2007-10-26 17:59) [1]Так я и не разобрался, спустя много времени ... подскажите, знающие люди.
← →
mdw © (2007-10-26 22:56) [2]Копай в сторону нотификаций заколовка, смотри HDN_BEGINTRACK, HDN_ENDTRACK, HDN_TRACK.
← →
Rusya (2007-10-31 05:18) [3]
> mdw © (26.10.07 22:56) [2]
> Копай в сторону нотификаций заколовка, смотри HDN_BEGINTRACK,
> HDN_ENDTRACK, HDN_TRACK.
Что самое интересное, ловятся только HDN_BEGINTRACKW и HDN_ENDTRACKW. Уведомления HDN_BEGINTRACK, HDN_TRACK, HDN_ENDTRACK (и HDN_TRACKW) не ловятся.
Перехватывал с помощью таких конструкций (менял код нотификации, в сравнении, при необходимости):
function TForm1.LVMessage(var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
Result:= false;
if ( Msg.message = WM_NOTIFY ) then
begin
if ( PNMHDR( Msg.lParam ).code = HDN_TRACK ) then
MsgOk(" HDN_TRACK ");
end;
end;
procedure TForm1.KOLForm1Show(Sender: PObj);
begin
LV.AttachProc( @TForm1.LVMessage );
end;
(можно и не аттачить, а просто назначить процедуру LVMessage обработчиком события OnMessage для ListView - результат один и тот же).
А теперь вопросы:
1) почему вместо HDN_*TRACKA приходят HDN_*TRACKW? (UNICODE_CTRLS не включал).
2) почему не приходят HDN_TRACK или HDN_TRACKW при перемещении сплиттера столбца ListView? Все остальное доходит, но мне нужно отслеживать именно изменение ширины столбца.
ЗЫ. WinXP Rus SP2, Delphi 7, KOL/MCK 2.83, на форме только ListView и ecmListView, на обоих такой результат.
← →
mdw © (2007-10-31 11:21) [4]
> 1) почему вместо HDN_*TRACKA приходят HDN_*TRACKW? (UNICODE_CTRLS
> не включал).
Ну, видимо Listview всегда создает юникодный заголовок, независимо от режима создания его самого.
← →
mdw © (2007-10-31 11:28) [5]
> 2) почему не приходят HDN_TRACK или HDN_TRACKW при перемещении
> сплиттера столбца ListView? Все остальное доходит, но мне
> нужно отслеживать именно изменение ширины столбца.
Что можно посоветовать. Первый вариант. Поставь оконную процедуру на заголовок и отслеживай там движение мыши в промежуток между HDN_BEGINTRACK и HDN_ENDTRACK. Ну а там уже обращайся к LVColWidth[].
Второй вариант. Используй отдельно заголовок и ListView в режиме lvsDetailNoHeader.
← →
Rusya (2007-10-31 11:29) [6]
> > 1) почему вместо HDN_*TRACKA приходят HDN_*TRACKW? (UNICODE_CTRLS
> > не включал).Ну, видимо Listview всегда создает юникодный
> заголовок, независимо от режима создания его самого.
Т.е. хотите сказать, что HDN_*TRACKA в KOL не имеет смысла? Всегда приходит HDN_*TRACKW ? И что делать с HDN_TRACKA/HDN_TRACKW, вернее с их отсутствием? Что неправильно делаю?
← →
mdw © (2007-10-31 11:39) [7]А HDN_TRACK скорее всего ListView не пропускает дальше, почему - вопрос к MS.
← →
mdw © (2007-10-31 11:41) [8]
> Т.е. хотите сказать, что HDN_*TRACKA в KOL не имеет смысла?
Да не в кол, а в ListView. Механизм такой: ListView при необходимости создает дочернее окно с классом "SysHeader32" и обрабатывает его нотификации как считает нужным и создает его тоже как считает нужным...
← →
Rusya (2007-10-31 11:48) [9]
> mdw © (31.10.07 11:28) [5]
> > 2) почему не приходят HDN_TRACK или HDN_TRACKW при перемещении
> > сплиттера столбца ListView? Все остальное доходит, но
> мне нужно отслеживать именно изменение ширины столбца.
> Что можно посоветовать. Первый вариант. Поставь оконную
> процедуру на заголовок и отслеживай там движение мыши в
> промежуток между HDN_BEGINTRACK и HDN_ENDTRACK. Ну а там
> уже обращайся к LVColWidth[].
Т.е. по HDN_BEGINTRACKW аттачить оконную процедуру на заголовок, а по HDN_ENDTRACKW детачить? Можно сделать, но это крайний случай, громоздко и вообще некрасиво. Придумали ведь HDN_TRACK, для этого предназначенный, но почему-то неработающий.
> Второй вариант. Используй отдельно
> заголовок и ListView в режиме lvsDetailNoHeader.
Этот вариант - то же самое, что первое, только придется еще вручную LVColWidth изменять. Galkov писал на форуме, что траблы возникают с WM_NOTIFY, но HDN_BEGINTRACKW/HDN_ENDTRACKW ловятся же?
И вообще, зачем костыли: давайте просто сделаем, чтоб HDN_TRACK работал как положено, в VCL работает же нормально. Если б у меня хватало знаний, я б поковырялся в библиотеке, поискал причину .. но увы.
← →
Rusya (2007-10-31 12:10) [10]
> mdw © (31.10.07 11:39) [7]
> А HDN_TRACK скорее всего ListView не пропускает дальше,
> почему - вопрос к MS.
А смысл тогда его документировать? В MSDN ясно написано, когда HDN_TRACK посылается (и кому).
← →
mdw © (2007-10-31 13:33) [11]
> А смысл тогда его документировать? В MSDN ясно написано,
> когда HDN_TRACK посылается (и кому).
Документирован для заголовка, но не ListView.
Если вот такой обработчик сделать для ListView и подвигать колонки, то видим что возникают нотификации HDN_ITEMCHANGING и HDN_ITEMCHANGED. Вот их и используйте.
function TMainForm.ListView1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
Result:= False;
if ( Msg.message = WM_NOTIFY ) then
Memo1.Add(Int2Str(PTBNotify(Msg.lParam).hdr.code)+#13#10);
end;
← →
Rusya (2007-10-31 13:47) [12]
> mdw © (31.10.07 13:33) [11]
> > А смысл тогда его документировать? В MSDN ясно написано,
> > когда HDN_TRACK посылается (и кому).Документирован для
> заголовка, но не ListView.
Если только для заголовка, тогда все понятно.
Только возникает такой вопрос: а если как в нашем случае Листбокс с заголовком, то по логике вещей заголовок листбокса тоже должен отсылать нотификации, подобно обычному заголовку. Я еще посмотрю, как обстоят дела с Листбоксом в VCL и голом winapi. Просто интересно.
← →
L`Autour © (2007-10-31 14:10) [13]Гарантированно можно через перехват WM_PAINT выравниваемые ширины элементов сравнивать (и менять при необходимости).
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.045 c