Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.28;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2008.09.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.025 c
15-1217839451
Prohodil Mimo
2008-08-04 12:44
2008.09.28
Вот какое у нас вчера было море :о)


2-1219215836
ReYo
2008-08-20 11:03
2008.09.28
Как узнать какое windows - окно активно?


15-1218034460
alex-drob
2008-08-06 18:54
2008.09.28
Новый закон о безнадзорности


15-1218183143
Dennis I. Komarov
2008-08-08 12:12
2008.09.28
Аборигены! Тут никого не будет? (вторник)


2-1218725745
atomAltera
2008-08-14 18:55
2008.09.28
Минимизация окна...