Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перехват ресайза колонок ListView


Dmitriy___ ©   (2007-03-24 22:25:00) 

Собственно, сабж. Как реализовать? Не могу ничего придумать. Или я снова торможу? :)


=BuckLr=   (2008-01-09 23:43:00) [1]


> rio

Гыыы! Хорошо пошутил. Главное, рекламу сделал


  (2008-01-09 23:41:00) [2]

Удалено модератором


  (2007-12-25 02:43:00) [3]

Удалено модератором


  (2007-12-25 02:43:00) [4]

Удалено модератором


  (2007-08-08 22:38:00) [5]

Удалено модератором


kichrot   (2007-03-28 10:47:00) [6]


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


Спасибо все понятно.


Vladimir Kladov   (2007-03-27 20:20:00) [7]

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


MTsv DN   (2007-03-27 11:29:00) [8]

> Хотя Кладов и говорит, что если программисты Borland не
> реализовали запрет  на изменение пользователем ширины колонки,
>  то это ни кому не надо. Но они много чего не реализовали.
>  В том числе и библиотеку подобную KOL.
> Если посмотреть темы данного форума, то подобный вопрос
> возникает периодически.
> Если в VCL он решается достаточно просто, перекрытием методов,
>  то в KOL это не срабатывает.
> Предлагаю один из способов решения данного вопроса.
> Правда в нем есть огрехи. Это только наметки, но вполне
> работоспособные.
> Естественно способ требует улучшения и возможно подход  
> не совсем правильный, но я только учусь.

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

Вроде уже разобрались с вопросом-то... Чего еще-то надо?


kichrot   (2007-03-27 10:19:00) [9]

Хотя Кладов и говорит, что если программисты 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.


Dmitriy___   (2007-03-26 22:21:00) [10]


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

Ну и у меня тоже. За код спасибо большое, работает отлично.


D[u]fa   (2007-03-26 18:07:00) [11]

Посмотрев оба кода - делаю вывод что одинаково...


MTsv DN   (2007-03-26 15:06:00) [12]

> Вот-вот, что-то вроде этого. Единственная загвоздка в том,
>  что 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;


И все...


Dmitriy___   (2007-03-26 11:52:00) [13]

Вот-вот, что-то вроде этого. Единственная загвоздка в том, что TWndMethod не существует в KOL, что и повергло меня в ступор


kichrot   (2007-03-26 11:23:00) [14]

В 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___   (2007-03-25 22:28:00) [15]


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

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

Да, и по ходу дела к вам, Владимир, вопрос. Я что-то не могу добраться до св-ва Hint, скажем, той же кнопки. Хотелось бы поменять его в рантайм - а вот как? Насколько я понял, такого свойства просто нет?


Vladimir Kladov   (2007-03-25 21:38:00) [16]

Значит, никак? :)
На самом деле, при желании - ловится. Добраться до header control'а, прицепить к нему свой перехват WM_NOTIFY, отловить HDN_CHANGING/CHANGED, и послать себе (или обработать тут же). Другое дело, надо ли оно вообще. VCL же не дураки делали. Если они не сделали, и с них за 10 лет до сих пор народ не стребовал, значит - не надо. Это что-то из той же области, что и импорт переменной из dll. В Delphi - нету. А надо? Я вообще о существовании такой возможности узнал с полгода как. И обошелся. Потму как мне - не надо. И практически ни одному пользователю Delphi не оказалось надо. Иначе было бы давно уже.


Dmitriy___   (2007-03-25 21:08:00) [17]

Понял, что тут непонятного... Закрываю тему


Vladimir Kladov   (2007-03-25 20:33:00) [18]

Интересно, а как в VCL?


Dmitriy___   (2007-03-25 20:18:00) [19]

Кто-нибудь!
В VCL было просто, как в KOL?


Наверх

Титульная страница Поиск, карта сайта Написать письмо