Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.16;
Скачать: CL | DM;

Вниз

Отловить 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
2-1203378891
Artem
2008-02-19 02:54
2008.03.16
Вопрос по colordialog1.Color


2-1203413997
KyRo
2008-02-19 12:39
2008.03.16
Компонент TGauge


15-1202123739
AlexKniga
2008-02-04 14:15
2008.03.16
Ищу игруху, где нужно узлы двигать, чтоб связи не пересекались.


15-1202467669
keymaster
2008-02-08 13:47
2008.03.16
Компонент для просмотра HTML


11-1185114823
=BuckLr=
2007-07-22 18:33
2008.03.16
XPMenus не работают