Конференция "KOL" » Перехват ресайза колонок ListView
 
  • Dmitriy___ (24.03.07 22:25) [0]
    Собственно, сабж. Как реализовать? Не могу ничего придумать. Или я снова торможу? :)
  • Dmitriy___ (25.03.07 20:18) [1]
    Кто-нибудь!
    В VCL было просто, как в KOL?
  • Vladimir Kladov (25.03.07 20:33) [2]
    Интересно, а как в VCL?
  • Dmitriy___ (25.03.07 21:08) [3]
    Понял, что тут непонятного... Закрываю тему
  • Vladimir Kladov (25.03.07 21:38) [4]
    Значит, никак? :)
    На самом деле, при желании - ловится. Добраться до header control'а, прицепить к нему свой перехват WM_NOTIFY, отловить HDN_CHANGING/CHANGED, и послать себе (или обработать тут же). Другое дело, надо ли оно вообще. VCL же не дураки делали. Если они не сделали, и с них за 10 лет до сих пор народ не стребовал, значит - не надо. Это что-то из той же области, что и импорт переменной из dll. В Delphi - нету. А надо? Я вообще о существовании такой возможности узнал с полгода как. И обошелся. Потму как мне - не надо. И практически ни одному пользователю Delphi не оказалось надо. Иначе было бы давно уже.
  • Dmitriy___ (25.03.07 22:28) [5]

    > Значит, никак? :)

    Да нет, не в этом дело, просто я подумал, что народу не интересно отвечать на столь тупые вопросы. Ловиться-то ловиться. Не стандартными обработчиками, конечно, а путём перехвата WM_NOTIFY. Есть примеры для VCL, вот я и говорю, что в VCL это просто. И, разумеется, всё получалось. А вот как это прикрутить к KOL, я не знал...
    Ну и способы для VCL, известные мне, не включают в себя какие-либо манипуляции с HDN_CHANGING/CHANGED, так что за подсказку - спасибо. Это всё, что мне было нужно.

    Да, и по ходу дела к вам, Владимир, вопрос. Я что-то не могу добраться до св-ва Hint, скажем, той же кнопки. Хотелось бы поменять его в рантайм - а вот как? Насколько я понял, такого свойства просто нет?
  • kichrot © (26.03.07 11:23) [6]
    В VCL это решается примерно таким образом:

    private
      FListViewOldWndProc: TWndMethod;
      procedure ListViewNewWndProc(var Msg: TMessage);
    end;

    {....}

    implementation

    uses
      CommCtrl;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     FListViewOldWndProc := ListView1.WindowProc;
     Listview1.WindowProc := ListViewNewWndProc;
    end;

    procedure TForm1.ListViewNewWndProc(var Msg: TMessage);
    var
      hdn: ^THDNotify;
    begin
      if Msg.Msg = WM_NOTIFY then
      begin
        hdn := Pointer(Msg.lParam);
        if (hdn.hdr.code = HDN_BeginTrackW) or (hdn.hdr.code = HDN_BeginTrackA) then
          Msg.Result := 1
        else
          FListViewOldWndProc(Msg);
      end
     else
         FListViewOldWndProc(Msg);
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
     ListView1.WindowProc := FlistViewOldWndProc;
      FListViewOldWndProc  := nil;
    end;

    Вполне возможно адаптировать этот пример на KOL.
  • Dmitriy___ (26.03.07 11:52) [7]
    Вот-вот, что-то вроде этого. Единственная загвоздка в том, что TWndMethod не существует в KOL, что и повергло меня в ступор
  • MTsv DN © (26.03.07 15:06) [8]
    > Вот-вот, что-то вроде этого. Единственная загвоздка в том,
    >  что TWndMethod не существует в KOL, что и повергло меня
    > в ступор

    В KOL все гораздо проще. Не знаю какая у Вас задача, а мне надо было блокировать изменение колонок:
    function TForm1.ListView1Message(var Msg: tagMSG;
     var Rslt: Integer): Boolean;
    const
     HDN_FIRST                = 0-300;
     HDN_LAST                 = 0-399;
     HDN_BEGINTRACKA     = HDN_FIRST-6;
     HDN_BEGINTRACKW     = HDN_FIRST-26;
    var
    NMHdr: PNMHdr;
    begin
    Result := false;
    if (Msg.message = WM_NOTIFY) then
     begin
      NMHdr := Pointer( Msg.lParam );
      case NMHdr^.code of
       HDN_BEGINTRACKA, HDN_BEGINTRACKW:
        begin
         ReleaseCapture;
         exit;
        end;
      end;
     end;



    И все...
  • D[u]fa © (26.03.07 18:07) [9]
    Посмотрев оба кода - делаю вывод что одинаково...
  • Dmitriy___ (26.03.07 22:21) [10]

    > Не знаю какая у Вас задача, а мне надо было блокировать
    > изменение колонок:

    Ну и у меня тоже. За код спасибо большое, работает отлично.
  • kichrot © (27.03.07 10:19) [11]
    Хотя Кладов и говорит, что если программисты Borland не реализовали запрет  на изменение пользователем ширины колонки, то это ни кому не надо. Но они много чего не реализовали. В том числе и библиотеку подобную KOL.
    Если посмотреть темы данного форума, то подобный вопрос возникает периодически.
    Если в VCL он решается достаточно просто, перекрытием методов, то в KOL это не срабатывает.
    Предлагаю один из способов решения данного вопроса.
    Правда в нем есть огрехи. Это только наметки, но вполне работоспособные.
    Естественно способ требует улучшения и возможно подход  не совсем правильный, но я только учусь.

    var
     Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;

     MyPoint: TPoint;
     

     {$IFDEF KOL_MCK}
     procedure NewForm1( var Result: PForm1; AParent: PControl );
     {$ENDIF}

    implementation

    {$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}

    {$IFDEF KOL_MCK}
    {$I Unit1_1.inc}
    {$ENDIF}

    //==============================================================================
    function TForm1.KOLApplet1Message(var Msg: tagMSG;
     var Rslt: Integer): Boolean;
    var
      hdn: ^TNMHdr;

    const
    // константы из CommCtrl
     HDN_FIRST                = 0-300;
     
     HDN_BEGINTRACKA          = HDN_FIRST-6;
     HDN_TRACKA               = HDN_FIRST-8;

     HDN_BEGINTRACKW          = HDN_FIRST-26;
     HDN_TRACKW               = HDN_FIRST-28;
     

    begin
    if Msg.message = WM_NOTIFY then
      begin
        hdn :=    Pointer(Msg.lParam);

        if (hdn.code = HDN_BeginTrackW) or (hdn.code = HDN_BeginTrackA) then
        begin
            GetCursorPos(MyPoint);
        end;
        if (hdn.code = HDN_TRACKW) or (hdn.code = HDN_TRACKA) then
        begin
           SetCursorPos(MyPoint.X, MyPoint.Y );
        end;

      end;

    end;


    end.
  • MTsv DN © (27.03.07 11:29) [12]
    > Хотя Кладов и говорит, что если программисты Borland не
    > реализовали запрет  на изменение пользователем ширины колонки,
    >  то это ни кому не надо. Но они много чего не реализовали.
    >  В том числе и библиотеку подобную KOL.
    > Если посмотреть темы данного форума, то подобный вопрос
    > возникает периодически.
    > Если в VCL он решается достаточно просто, перекрытием методов,
    >  то в KOL это не срабатывает.
    > Предлагаю один из способов решения данного вопроса.
    > Правда в нем есть огрехи. Это только наметки, но вполне
    > работоспособные.
    > Естественно способ требует улучшения и возможно подход  
    > не совсем правильный, но я только учусь.

    Если честно, ни фига не понял о чем тут написано :(

    Вроде уже разобрались с вопросом-то... Чего еще-то надо?
  • Vladimir Kladov (27.03.07 20:20) [13]
    Перекрытием - это как раз ни фига не просто. Ну вот, простой пример. Есть форма. На ней куча контролов. В дизайн-тайме все настроено. Допустим, в некоторый момент исходя из жизненно необходимых требований задачи возникает потребность "перекрыть" обработку сообщения некоторого контрола. Например, пусть это будет панель, или PageControl, на котором еще до фига других контролов. Ваши действия? (Достаточно ответа "понял разницу").
  • kichrot © (28.03.07 10:47) [14]

    > Перекрытием - это как раз ни фига не просто. Ну вот, простой
    > пример. Есть форма. На ней куча контролов. В дизайн-тайме
    > все настроено. Допустим, в некоторый момент исходя из жизненно
    > необходимых требований задачи возникает потребность "перекрыть"
    > обработку сообщения некоторого контрола. Например, пусть
    > это будет панель, или PageControl, на котором еще до фига
    > других контролов. Ваши действия? (Достаточно ответа "понял
    > разницу").
    >


    Спасибо все понятно.
  • имя (08.08.07 22:38) [15]
    Удалено модератором
  • имя (25.12.07 02:43) [16]
    Удалено модератором
  • имя (25.12.07 02:43) [17]
    Удалено модератором
  • имя (09.01.08 23:41) [18]
    Удалено модератором
  • =BuckLr= © (09.01.08 23:43) [19]

    > rio

    Гыыы! Хорошо пошутил. Главное, рекламу сделал
 
Конференция "KOL" » Перехват ресайза колонок ListView
Есть новые Нет новых   [134431   +10][b:0][p:0.001]