[CLOSED]Вопрос знатокам делфи / WinAPI

Slavaga

Компонент TCustomListBox генерирует событие OnClick, когда получает уведомление LBN_SELCHANGE.
Вопрос - каким образом контрол ловит это уведомление?! Уже полдня смотрю исходники и все не могу понять
Единственное, что приходит в голову - это подменять WindowProc родителя и ловить сообщение там, но вариант дурацкий.
В оконную процедуру ListBox'a приходит только LBN_KILLFOCUS и LBN_SETFOCUS.

Andbar

обычно сообщения ловятся динамическими методами, при этом менять оконную процедуру ни для чего не нужно...
Т.е.
procedure messageproc(var msg:TMessage{на счет типа параметра не уверен});message LBN_SELCHANGE;
неужели так не работает?

Slavaga

1. А это принципиально не то же самое, как если ловить сообщения в перегруженной WndProc?
2. А эта конструкция
procedure messageproc(var msg:TMessage{на счет типа параметра не уверен});message LBN_SELCHANGE;
в билдере иммет аналог?

Slavaga

Новая информация:
В процедуру обработки сообщений родительского окна уведомления LBN_SELCHANGE и др. тоже не проходят
Может надо какой-то стиль окна указать специфический?

Andbar

Мм...
1. скорее всего так и есть, но только этот вариант более ... красивый чтоли. Соответствует стилю, в общем.
2. ммм... вот этого не могу сказать точно, по моим представлениям, разница билдера и дельфи - только в языке. Т.е., если в сях, которые использует билдер, есть динамические методы, то это должен быть динамический метод с номером-идентификатором соответствующим номеру сообщения. Впрочем, по идее, должно быть отдельное зарезервированное слово для этого, но прописываются как динамический метод.
Т.е., в Object Pascal есть
procedure bla-bla-bla(.... );dinamic 20;
а есть
procedure bla-bla-bla(.... );message WM_CLOSE;

Andbar

млин, всё проще...
procedure TCustomListBox.CNCommand(var Message: TWMCommand);
begin
case Message.NotifyCode of
LBN_SELCHANGE:
begin
inherited Changed;
Click;
end;
LBN_DBLCLK: DblClick;
end;
end;

смотрим, что такое TCustomListBox.CNCommand:
  TCustomListBox = class(TCustomMultiSelectListControl)
private
{.........}
procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
{..........}
end;
Вопросы еще остались?

Slavaga

Я воткнул в чем дело =)
В стиле листбокса надо было установить LBS_NOTIFY. Без этого сообщения типа LBN_SELCHANGE не генерятся вообще.
Обработка сообщения может производиться в WndProc. C CNCommand попробую пошаманить, но на нее описалова вообще никакого нету =/.
В любом случае спасибо за советы - по крайней мере я понял, почему нигде не встречается вызовы типа SomeClass.CNCommand

Slavaga

CNCommand тоже можно использовать. В объявлении класса пишем:
...
void __fastcall CNCommand(TMessage &Message);
...
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(CN_COMMAND, TMessage, CNCommand)
END_MESSAGE_MAP(TRichEdit);
В методе CNCommand пишем обработчик события.
Оставить комментарий
Имя или ник:
Комментарий: