Конференция "KOL" » ListView и EditBox - как? [Delphi, Windows]
 
  • Rusya (10.10.07 11:20) [0]
    Hello all,
    У меня на форме ecmListView и поле KOLEditBox. Как сделать так, чтобы при изменении ширины одного из столбцов списка автоматически изменялась ширина editbox'a?
  • Rusya (26.10.07 17:59) [1]
    Так я и не разобрался, спустя много времени ... подскажите, знающие люди.
  • mdw © (26.10.07 22:56) [2]
    Копай в сторону нотификаций заколовка, смотри HDN_BEGINTRACK, HDN_ENDTRACK, HDN_TRACK.
  • Rusya (31.10.07 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 © (31.10.07 11:21) [4]

    > 1) почему вместо HDN_*TRACKA приходят HDN_*TRACKW? (UNICODE_CTRLS
    > не включал).

    Ну, видимо Listview всегда создает юникодный заголовок, независимо от режима создания его самого.
  • mdw © (31.10.07 11:28) [5]

    > 2) почему не приходят HDN_TRACK или HDN_TRACKW при перемещении
    > сплиттера столбца ListView? Все остальное доходит, но мне
    > нужно отслеживать именно изменение ширины столбца.

    Что можно посоветовать. Первый вариант. Поставь оконную процедуру на заголовок и отслеживай там движение мыши в промежуток между HDN_BEGINTRACK и HDN_ENDTRACK. Ну а там уже обращайся к LVColWidth[].
    Второй вариант. Используй отдельно заголовок и ListView в режиме lvsDetailNoHeader.
  • Rusya (31.10.07 11:29) [6]

    > > 1) почему вместо HDN_*TRACKA приходят HDN_*TRACKW? (UNICODE_CTRLS
    > > не включал).Ну, видимо Listview всегда создает юникодный
    > заголовок, независимо от режима создания его самого.

    Т.е. хотите сказать, что HDN_*TRACKA в KOL не имеет смысла? Всегда приходит HDN_*TRACKW ? И что делать с HDN_TRACKA/HDN_TRACKW, вернее с их отсутствием? Что неправильно делаю?
  • mdw © (31.10.07 11:39) [7]
    А HDN_TRACK скорее всего ListView не пропускает дальше, почему - вопрос к MS.
  • mdw © (31.10.07 11:41) [8]

    > Т.е. хотите сказать, что HDN_*TRACKA в KOL не имеет смысла?

    Да не в кол, а в ListView. Механизм такой: ListView при необходимости создает дочернее окно с классом 'SysHeader32' и обрабатывает его нотификации как считает нужным и создает его тоже как считает нужным...
  • Rusya (31.10.07 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 (31.10.07 12:10) [10]

    > mdw ©   (31.10.07 11:39) [7]
    > А HDN_TRACK скорее всего ListView не пропускает дальше,
    > почему - вопрос к MS.

    А смысл тогда его документировать? В MSDN ясно написано, когда HDN_TRACK посылается (и кому).
  • mdw © (31.10.07 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 (31.10.07 13:47) [12]

    > mdw ©   (31.10.07 13:33) [11]
    > > А смысл тогда его документировать? В MSDN ясно написано,
    > >  когда HDN_TRACK посылается (и кому).Документирован для
    > заголовка, но не ListView.

    Если только для заголовка, тогда все понятно.

    Только возникает такой вопрос: а если как в нашем случае Листбокс с заголовком, то по логике вещей заголовок листбокса тоже должен отсылать нотификации, подобно обычному заголовку. Я еще посмотрю, как обстоят дела с Листбоксом в VCL и голом winapi. Просто интересно.
  • L`Autour © (31.10.07 14:10) [13]
    Гарантированно можно через перехват WM_PAINT выравниваемые ширины элементов сравнивать (и менять при необходимости).
 
Конференция "KOL" » ListView и EditBox - как? [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]