-
Hello all, У меня на форме ecmListView и поле KOLEditBox. Как сделать так, чтобы при изменении ширины одного из столбцов списка автоматически изменялась ширина editbox'a?
-
Так я и не разобрался, спустя много времени ... подскажите, знающие люди.
-
Копай в сторону нотификаций заколовка, смотри HDN_BEGINTRACK, HDN_ENDTRACK, HDN_TRACK.
-
> 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, на обоих такой результат.
-
> 1) почему вместо HDN_*TRACKA приходят HDN_*TRACKW? (UNICODE_CTRLS > не включал).
Ну, видимо Listview всегда создает юникодный заголовок, независимо от режима создания его самого.
-
> 2) почему не приходят HDN_TRACK или HDN_TRACKW при перемещении > сплиттера столбца ListView? Все остальное доходит, но мне > нужно отслеживать именно изменение ширины столбца.
Что можно посоветовать. Первый вариант. Поставь оконную процедуру на заголовок и отслеживай там движение мыши в промежуток между HDN_BEGINTRACK и HDN_ENDTRACK. Ну а там уже обращайся к LVColWidth[]. Второй вариант. Используй отдельно заголовок и ListView в режиме lvsDetailNoHeader.
-
> > 1) почему вместо HDN_*TRACKA приходят HDN_*TRACKW? (UNICODE_CTRLS > > не включал).Ну, видимо Listview всегда создает юникодный > заголовок, независимо от режима создания его самого.
Т.е. хотите сказать, что HDN_*TRACKA в KOL не имеет смысла? Всегда приходит HDN_*TRACKW ? И что делать с HDN_TRACKA/HDN_TRACKW, вернее с их отсутствием? Что неправильно делаю?
-
А HDN_TRACK скорее всего ListView не пропускает дальше, почему - вопрос к MS.
-
> Т.е. хотите сказать, что HDN_*TRACKA в KOL не имеет смысла?
Да не в кол, а в ListView. Механизм такой: ListView при необходимости создает дочернее окно с классом 'SysHeader32' и обрабатывает его нотификации как считает нужным и создает его тоже как считает нужным...
-
> 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 работает же нормально. Если б у меня хватало знаний, я б поковырялся в библиотеке, поискал причину .. но увы.
-
> mdw © (31.10.07 11:39) [7] > А HDN_TRACK скорее всего ListView не пропускает дальше, > почему - вопрос к MS.
А смысл тогда его документировать? В MSDN ясно написано, когда HDN_TRACK посылается (и кому).
-
> А смысл тогда его документировать? В 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;
-
> mdw © (31.10.07 13:33) [11] > > А смысл тогда его документировать? В MSDN ясно написано, > > когда HDN_TRACK посылается (и кому).Документирован для > заголовка, но не ListView.
Если только для заголовка, тогда все понятно.
Только возникает такой вопрос: а если как в нашем случае Листбокс с заголовком, то по логике вещей заголовок листбокса тоже должен отсылать нотификации, подобно обычному заголовку. Я еще посмотрю, как обстоят дела с Листбоксом в VCL и голом winapi. Просто интересно.
-
Гарантированно можно через перехват WM_PAINT выравниваемые ширины элементов сравнивать (и менять при необходимости).
|