![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отловить Vk_Left в TScrollBox
None © (2008-02-18 10:21:00)Здравствуйте. Пишу наследника от TScrollBox. В нем я рассшарил методы onkeydown, onkeyup и onkeypress. Так же добавил setfocus и focused.
Задача стоит следующая: При клике на скролбоксе, оный должен должен стать выделенным и начать принимать сообщения с клавиатуры. Что собсна он и делает. Но по какойто причине не хочет (а скорее всего где-то внутри компонента-родителя заблокированы) сообшения о нажатие стрелок. До того как я расшарил те методы, я пробовал отлавливать просто сообщения "WM_KEYDOWN" и др. Та же ерунда. Как можно победить?
None (2008-02-19 10:17:00) [1]Спасибо исправил
Семеныч (2008-02-19 10:04:00) [2]> None (19.02.08 07:05) [15]
Там ошибка. Должно быть так:
procedure TScrollboxX.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
inherited;
Message.Result := Message.Result or DLGC_WANTARROWS;
end;
Иначе поимеем стрелки, но можем потерять что-то другое.
None (2008-02-19 07:05:00) [3]Для ищущих:
http://groups.google.ru/group/comp.lang.pascal.delphi.misc/browse_thread/thread/efa4e7263faa6454/a5e218d55b5b1ddb?hl=ru&lnk=st&q=WM_GETDLGCODE+tscrollbox+arrow#a5e218d55b5b1ddb
В самом низу
None (2008-02-19 06:31:00) [4]Всем спасибо за обсуждение. Сделал через WM_GETDLGCODE.
> Легко: я пишу его только для себя
Пока для себя. Но может быть, что потом и поделюсь с кем небуть. Частенько встречал топики о поиске этой компоненты. Так что Семеныч тут прав, когда говорил
> Осетрина не бывает второй свежести
Семеныч (2008-02-19 01:01:00) [5]> KilkennyCat © (19.02.08 00:58) [12]
... плавно перерастающий как раз в такой... ты же именно к этому стремишься?
:о)
KilkennyCat (2008-02-19 00:58:00) [6]> [10] Семеныч (19.02.08 00:51)
Гы :) это уже не такой случай :)
Германн (2008-02-19 00:58:00) [7]
> Семеныч (19.02.08 00:51) [10]
>
> > KilkennyCat © (18.02.08 23:49) [9]
>
> У тебя ведь своя контора? Ну так вот - ты нанимаешь программера
> на развитие и поддержку своего софта... мама, не горюй!
>
У него общая с Алмазом контора. Но должности распределены. :)
Вник?
Семеныч (2008-02-19 00:51:00) [8]> KilkennyCat © (18.02.08 23:49) [9]
У тебя ведь своя контора? Ну так вот - ты нанимаешь программера на развитие и поддержку своего софта... мама, не горюй!
ПыСы
Осетрина не бывает второй свежести, понимаешь?
KilkennyCat (2008-02-18 23:49:00) [9]> [8] Семеныч (18.02.08 22:59)
Легко: я пишу его только для себя и четко понимаю, что творю.
Семеныч (2008-02-18 22:59:00) [10]> KilkennyCat © (18.02.08 20:18) [7]
Не согласен категорически. Можешь привести пример такого случая?
KilkennyCat (2008-02-18 20:18:00) [11]> [6] Семеныч (18.02.08 19:26)
в ограниченных случаях допустимо.
Семеныч (2008-02-18 19:26:00) [12]> None (18.02.08 19:06) [5]
> На сколько идеологически будет верно, использовать внутри компоненты
> обработчик application.OnMessage
Это будет грубейшей ошибкой. Компоненты вообще не имеют права использовать события, доступные юзеру (т.е., программисту). Потому что он может (и имеет полное право) назначить событию свой собственный обработчик - и получится конфликт.
None (2008-02-18 19:06:00) [13]
> KilkennyCat © (18.02.08 17:08) [2]
> KilkennyCat © (18.02.08 17:13) [3]
Согласен. Уже подправил.
> Семеныч (18.02.08 17:13) [4]
Завтра попробую.
На данном этапе такой вопрос. На сколько идеологически будет верно, использовать внутри компоненты обработчик application.OnMessage?
Семеныч (2008-02-18 17:13:00) [14]> Но по какойто причине не хочет (а скорее всего где-то внутри
> компонента-родителя заблокированы) сообшения о нажатие стрелок
Обработайте сообщение WM_GETDLGCODE (gодробности см. в справке по WinAPI) и в нем разрешите прием нажатий стрелок. И все.
KilkennyCat (2008-02-18 17:13:00) [15]and (msg.wParam in [37, 38, 39, 40])
и это тоже лишнее
KilkennyCat (2008-02-18 17:08:00) [16]а зачем inherited дважды?
None (2008-02-18 12:47:00) [17]Решил проблему таким образом. Насколько это верно либо не верно?
application.OnMessage := MessageRG;
...
procedure TPredViemList.MessageRG(var Msg: TMsg; var Handled: Boolean);
begin
if Assigned(self) and (msg.message = WM_KEYDOWN) and (msg.wParam in [37, 38, 39, 40]) and (self.Focuseds) then
begin
case msg.wParam of
37: showmessage('Left');
38: showmessage('Up');
39: showmessage('Right');
40: showmessage('Down');
end;
inherited;
end
else inherited;
end;