Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.008 c
2-1203008491
Квэнди
2008-02-14 20:01
2008.03.16
3DES в Delphi


11-1184948750
ElectriC
2007-07-20 20:25
2008.03.16
Vista Aero


2-1203442763
ввв
2008-02-19 20:39
2008.03.16
Отрисовка в TComboBox


2-1202460936
igor666
2008-02-08 11:55
2008.03.16
Сервис, подсчитывающий время бездействия ПК


15-1202216991
Mary
2008-02-05 16:09
2008.03.16
Решение СЛАУ методом Зейделя





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский