![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ListView и EditBox - как? [Delphi, Windows]
Rusya © (2007-10-10 11:20:00)Hello all,
У меня на форме ecmListView и поле KOLEditBox. Как сделать так, чтобы при изменении ширины одного из столбцов списка автоматически изменялась ширина editbox'a?
L`Autour (2007-10-31 14:10:00) [1]Гарантированно можно через перехват WM_PAINT выравниваемые ширины элементов сравнивать (и менять при необходимости).
Rusya (2007-10-31 13:47:00) [2]
> mdw © (31.10.07 13:33) [11]
> > А смысл тогда его документировать? В MSDN ясно написано,
> > когда HDN_TRACK посылается (и кому).Документирован для
> заголовка, но не ListView.
Если только для заголовка, тогда все понятно.
Только возникает такой вопрос: а если как в нашем случае Листбокс с заголовком, то по логике вещей заголовок листбокса тоже должен отсылать нотификации, подобно обычному заголовку. Я еще посмотрю, как обстоят дела с Листбоксом в VCL и голом winapi. Просто интересно.
mdw (2007-10-31 13:33:00) [3]
> А смысл тогда его документировать? В 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 12:10:00) [4]
> mdw © (31.10.07 11:39) [7]
> А HDN_TRACK скорее всего ListView не пропускает дальше,
> почему - вопрос к MS.
А смысл тогда его документировать? В MSDN ясно написано, когда HDN_TRACK посылается (и кому).
Rusya (2007-10-31 11:48:00) [5]
> 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 (2007-10-31 11:41:00) [6]
> Т.е. хотите сказать, что HDN_*TRACKA в KOL не имеет смысла?
Да не в кол, а в ListView. Механизм такой: ListView при необходимости создает дочернее окно с классом 'SysHeader32' и обрабатывает его нотификации как считает нужным и создает его тоже как считает нужным...
mdw (2007-10-31 11:39:00) [7]А HDN_TRACK скорее всего ListView не пропускает дальше, почему - вопрос к MS.
Rusya (2007-10-31 11:29:00) [8]
> > 1) почему вместо HDN_*TRACKA приходят HDN_*TRACKW? (UNICODE_CTRLS
> > не включал).Ну, видимо Listview всегда создает юникодный
> заголовок, независимо от режима создания его самого.
Т.е. хотите сказать, что HDN_*TRACKA в KOL не имеет смысла? Всегда приходит HDN_*TRACKW ? И что делать с HDN_TRACKA/HDN_TRACKW, вернее с их отсутствием? Что неправильно делаю?
mdw (2007-10-31 11:28:00) [9]
> 2) почему не приходят HDN_TRACK или HDN_TRACKW при перемещении
> сплиттера столбца ListView? Все остальное доходит, но мне
> нужно отслеживать именно изменение ширины столбца.
Что можно посоветовать. Первый вариант. Поставь оконную процедуру на заголовок и отслеживай там движение мыши в промежуток между HDN_BEGINTRACK и HDN_ENDTRACK. Ну а там уже обращайся к LVColWidth[].
Второй вариант. Используй отдельно заголовок и ListView в режиме lvsDetailNoHeader.
mdw (2007-10-31 11:21:00) [10]
> 1) почему вместо HDN_*TRACKA приходят HDN_*TRACKW? (UNICODE_CTRLS
> не включал).
Ну, видимо Listview всегда создает юникодный заголовок, независимо от режима создания его самого.
Rusya (2007-10-31 05:18:00) [11]
> 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-26 22:56:00) [12]Копай в сторону нотификаций заколовка, смотри HDN_BEGINTRACK, HDN_ENDTRACK, HDN_TRACK.
Rusya (2007-10-26 17:59:00) [13]Так я и не разобрался, спустя много времени ... подскажите, знающие люди.