Форум: "Начинающим";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];
ВнизОтловить Vk_Left в TScrollBox Найти похожие ветки
← →
None (2008-02-18 10:21) [0]Здравствуйте. Пишу наследника от TScrollBox. В нем я рассшарил методы onkeydown, onkeyup и onkeypress. Так же добавил setfocus и focused.
Задача стоит следующая: При клике на скролбоксе, оный должен должен стать выделенным и начать принимать сообщения с клавиатуры. Что собсна он и делает. Но по какойто причине не хочет (а скорее всего где-то внутри компонента-родителя заблокированы) сообшения о нажатие стрелок. До того как я расшарил те методы, я пробовал отлавливать просто сообщения "WM_KEYDOWN" и др. Та же ерунда. Как можно победить?
← →
None (2008-02-18 12:47) [1]Решил проблему таким образом. Насколько это верно либо не верно?
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;
← →
KilkennyCat © (2008-02-18 17:08) [2]а зачем inherited дважды?
← →
KilkennyCat © (2008-02-18 17:13) [3]and (msg.wParam in [37, 38, 39, 40])
и это тоже лишнее
← →
Семеныч (2008-02-18 17:13) [4]> Но по какойто причине не хочет (а скорее всего где-то внутри
> компонента-родителя заблокированы) сообшения о нажатие стрелок
Обработайте сообщение WM_GETDLGCODE (gодробности см. в справке по WinAPI) и в нем разрешите прием нажатий стрелок. И все.
← →
None (2008-02-18 19:06) [5]
> 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 19:26) [6]> None (18.02.08 19:06) [5]
> На сколько идеологически будет верно, использовать внутри компоненты
> обработчик application.OnMessage
Это будет грубейшей ошибкой. Компоненты вообще не имеют права использовать события, доступные юзеру (т.е., программисту). Потому что он может (и имеет полное право) назначить событию свой собственный обработчик - и получится конфликт.
← →
KilkennyCat © (2008-02-18 20:18) [7]> [6] Семеныч (18.02.08 19:26)
в ограниченных случаях допустимо.
← →
Семеныч (2008-02-18 22:59) [8]> KilkennyCat © (18.02.08 20:18) [7]
Не согласен категорически. Можешь привести пример такого случая?
← →
KilkennyCat © (2008-02-18 23:49) [9]> [8] Семеныч (18.02.08 22:59)
Легко: я пишу его только для себя и четко понимаю, что творю.
← →
Семеныч (2008-02-19 00:51) [10]> KilkennyCat © (18.02.08 23:49) [9]
У тебя ведь своя контора? Ну так вот - ты нанимаешь программера на развитие и поддержку своего софта... мама, не горюй!
ПыСы
Осетрина не бывает второй свежести, понимаешь?
← →
Германн © (2008-02-19 00:58) [11]
> Семеныч (19.02.08 00:51) [10]
>
> > KilkennyCat © (18.02.08 23:49) [9]
>
> У тебя ведь своя контора? Ну так вот - ты нанимаешь программера
> на развитие и поддержку своего софта... мама, не горюй!
>
У него общая с Алмазом контора. Но должности распределены. :)
Вник?
← →
KilkennyCat © (2008-02-19 00:58) [12]> [10] Семеныч (19.02.08 00:51)
Гы :) это уже не такой случай :)
← →
Семеныч (2008-02-19 01:01) [13]> KilkennyCat © (19.02.08 00:58) [12]
... плавно перерастающий как раз в такой... ты же именно к этому стремишься?
:о)
← →
None (2008-02-19 06:31) [14]Всем спасибо за обсуждение. Сделал через WM_GETDLGCODE.
> Легко: я пишу его только для себя
Пока для себя. Но может быть, что потом и поделюсь с кем небуть. Частенько встречал топики о поиске этой компоненты. Так что Семеныч тут прав, когда говорил
> Осетрина не бывает второй свежести
← →
None (2008-02-19 07:05) [15]Для ищущих:
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
В самом низу
← →
Семеныч (2008-02-19 10:04) [16]> 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 10:17) [17]Спасибо исправил
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c