-
Собственно, сабж. Как реализовать? Не могу ничего придумать. Или я снова торможу? :)
-
Кто-нибудь! В VCL было просто, как в KOL?
-
Интересно, а как в VCL?
-
Понял, что тут непонятного... Закрываю тему
-
Значит, никак? :) На самом деле, при желании - ловится. Добраться до header control'а, прицепить к нему свой перехват WM_NOTIFY, отловить HDN_CHANGING/CHANGED, и послать себе (или обработать тут же). Другое дело, надо ли оно вообще. VCL же не дураки делали. Если они не сделали, и с них за 10 лет до сих пор народ не стребовал, значит - не надо. Это что-то из той же области, что и импорт переменной из dll. В Delphi - нету. А надо? Я вообще о существовании такой возможности узнал с полгода как. И обошелся. Потму как мне - не надо. И практически ни одному пользователю Delphi не оказалось надо. Иначе было бы давно уже.
-
> Значит, никак? :)
Да нет, не в этом дело, просто я подумал, что народу не интересно отвечать на столь тупые вопросы. Ловиться-то ловиться. Не стандартными обработчиками, конечно, а путём перехвата WM_NOTIFY. Есть примеры для VCL, вот я и говорю, что в VCL это просто. И, разумеется, всё получалось. А вот как это прикрутить к KOL, я не знал... Ну и способы для VCL, известные мне, не включают в себя какие-либо манипуляции с HDN_CHANGING/CHANGED, так что за подсказку - спасибо. Это всё, что мне было нужно.
Да, и по ходу дела к вам, Владимир, вопрос. Я что-то не могу добраться до св-ва Hint, скажем, той же кнопки. Хотелось бы поменять его в рантайм - а вот как? Насколько я понял, такого свойства просто нет?
-
В 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.
-
Вот-вот, что-то вроде этого. Единственная загвоздка в том, что TWndMethod не существует в KOL, что и повергло меня в ступор
-
> Вот-вот, что-то вроде этого. Единственная загвоздка в том, > что 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; И все...
-
Посмотрев оба кода - делаю вывод что одинаково...
-
> Не знаю какая у Вас задача, а мне надо было блокировать > изменение колонок:
Ну и у меня тоже. За код спасибо большое, работает отлично.
-
Хотя Кладов и говорит, что если программисты 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.
-
> Хотя Кладов и говорит, что если программисты Borland не > реализовали запрет на изменение пользователем ширины колонки, > то это ни кому не надо. Но они много чего не реализовали. > В том числе и библиотеку подобную KOL. > Если посмотреть темы данного форума, то подобный вопрос > возникает периодически. > Если в VCL он решается достаточно просто, перекрытием методов, > то в KOL это не срабатывает. > Предлагаю один из способов решения данного вопроса. > Правда в нем есть огрехи. Это только наметки, но вполне > работоспособные. > Естественно способ требует улучшения и возможно подход > не совсем правильный, но я только учусь. Если честно, ни фига не понял о чем тут написано :(
Вроде уже разобрались с вопросом-то... Чего еще-то надо?
-
Перекрытием - это как раз ни фига не просто. Ну вот, простой пример. Есть форма. На ней куча контролов. В дизайн-тайме все настроено. Допустим, в некоторый момент исходя из жизненно необходимых требований задачи возникает потребность "перекрыть" обработку сообщения некоторого контрола. Например, пусть это будет панель, или PageControl, на котором еще до фига других контролов. Ваши действия? (Достаточно ответа "понял разницу").
-
> Перекрытием - это как раз ни фига не просто. Ну вот, простой > пример. Есть форма. На ней куча контролов. В дизайн-тайме > все настроено. Допустим, в некоторый момент исходя из жизненно > необходимых требований задачи возникает потребность "перекрыть" > обработку сообщения некоторого контрола. Например, пусть > это будет панель, или PageControl, на котором еще до фига > других контролов. Ваши действия? (Достаточно ответа "понял > разницу"). >
Спасибо все понятно.
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
> rio
Гыыы! Хорошо пошутил. Главное, рекламу сделал
|