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

Вниз

Как отловить нажатия на стрелки, не блокируя их?   Найти похожие ветки 

 
Alex80   (2014-02-03 07:02) [0]

Кидаю на форму TActionList, создаю в нём экшены на нажатия стрелок, чтобы их отлавливать. Создают событие OnExecute. Всё нормально отлавливаются стрелки. ... Но в других контролах стрелки перестали работать. Как починить?


 
Dimka Maslov ©   (2014-02-03 11:25) [1]

Если копнуть поглубже в механизм передачи клавиатурного ввода от операционной системы в активное окно, то мы увидим замечательную картину: система сначала посылает окну сообщение WM_GETDLGCODE, дабы узнать, хочет ли окно само отбрабатывать стрелки, табы и прочий управляющий ввод, либо же передавать фокус в другое окно.


 
Йа   (2014-02-03 12:40) [2]

WTF стрелки?


 
sniknik ©   (2014-02-03 12:57) [3]

> WTF стрелки?
http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%B5%D0%BB%D0%BA%D0%B8_%28%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0%29


 
brother ©   (2014-02-03 13:03) [4]

> Но в других контролах стрелки перестали работать

[3]
Правильно, ибо нефиг делить их с другими :)

> Как починить?

Когда девочки ломаются, мальчики обязаны найти пути ремонта ;)


 
Alex80   (2014-02-04 01:09) [5]


> Dimka Maslov ©   (03.02.14 11:25) [1]
> Если копнуть поглубже в механизм передачи клавиатурного
> ввода от операционной системы в активное окно, то мы увидим
> замечательную картину: система сначала посылает окну сообщение
> WM_GETDLGCODE, дабы узнать, хочет ли окно само отбрабатывать
> стрелки, табы и прочий управляющий ввод, либо же передавать
> фокус в другое окно.

А как это использовать чтобы отловить стрелки, но не заблокировать их?


 
Alex80   (2014-02-04 01:44) [6]

Ещё проблема. Нужно, чтобы приходили повторения нажатия на стрелки, когда держишь их слишком долго.

Неужели я первый кто с этим д*** сталкиваюсь? Неужели нет какого-нибудь давно найденного решения или компонента?


 
Inovet ©   (2014-02-04 01:58) [7]

> [6] Alex80   (04.02.14 01:44)
> Неужели я первый кто с этим д*** сталкиваюсь?

Видимо, никто так не делает, а если делает, так не нужны они в «других контролах».


 
Alex80   (2014-02-04 02:32) [8]

Например, человек ставит GLScene. Когда фокус находится на TGLSceneViewer, то у него нет событий OnKeyPress, OnKeyDown, OnKeyUp.


 
sniknik ©   (2014-02-04 08:16) [9]

> Неужели я первый кто с этим д*** сталкиваюсь?
ну, так, редко находятся индивиды желающие "на моторной лодке по красной площади"... большинство понимают, что значит предназначение используемого средства.

> Неужели нет какого-нибудь давно найденного решения или компонента?
решение как раз не в поиске новых, а в "убрании" лишних компонентов, раз не подходит как они работают. или поменять логику программы на ту под которую они предназначены.

>ставит GLScene ... то у него нет событий OnKeyPress, OnKeyDown, OnKeyUp.
?
вот прям таки всех перечисленных? пусть поставит простой TEdit, в новом проекте, и проверит еще раз все эти события. а то может проблема и не в акциях вовсе.


 
Alex80   (2014-02-04 08:25) [10]


> пусть поставит простой TEdit, в новом проекте

А такие советы вы будете давать создателям Ассассинс Крид.
Пусть вместо нормального решения Теедиты ставят.


 
sniknik ©   (2014-02-04 09:55) [11]

совет для определение проблемы, посмотреть на другой (лишний, неправильный???, классический) компонент и сделать пару лишних действий вызывает отторжение? тогда другой совет - займись чем нибудь другим. думаю больше тебе понравится. нафига тебе это программирование?


 
Alex80   (2014-02-05 07:38) [12]


> осмотреть на другой (лишний, неправильный???, классический)
> компонент

GLScene не является "лишним" компонентом. Это основной компонент программы.


 
brother ©   (2014-02-05 07:43) [13]

> Это основной компонент программы.

не программы, а игрового движка...


 
Inovet ©   (2014-02-05 07:44) [14]

> [12] Alex80   (05.02.14 07:38)
> GLScene не является «лишним» компонентом.

Ты даже не понимаешь ответов, советов.


 
Alex80   (2014-02-05 11:07) [15]


> Ты даже не понимаешь ответов, советов.

"Телепаты в отпуске." ©


 
Alex80   (2014-02-05 11:31) [16]


> brother ©   (05.02.14 07:43) [13]
> > Это основной компонент программы.не программы, а игрового
> движка...

Программа не является игровым движком. GLScene используется для отображения 3D-графики.


 
Inovet ©   (2014-02-05 11:35) [17]

> [15] Alex80   (05.02.14 11:07)
> «Телепаты в отпуске.» ©

Для понимания предложенного выше способности к телепатии не требуются.


 
Плохиш ©   (2014-02-05 12:41) [18]


> Alex80   (05.02.14 11:07) [15]
>
>
> > Ты даже не понимаешь ответов, советов.
>
> "Телепаты в отпуске." ©

Так это сугубо твои проблемы.

> Alex80   (04.02.14 08:25) [10]
>
>
> > пусть поставит простой TEdit, в новом проекте
>
> А такие советы вы будете давать создателям Ассассинс Крид.
>

Не знаю кто это-такие, но судя по вопросам их сотрудников, тот ещё детский сад сантехников.


 
Alex80   (2014-02-05 13:54) [19]


> Inovet ©   (05.02.14 11:35) [17]
> > [15] Alex80   (05.02.14 11:07)> «Телепаты в отпуске.»
> ©Для понимания предложенного выше способности к телепатии
> не требуются.

Докажите кодом.


 
Inovet ©   (2014-02-05 14:55) [20]

> [19] Alex80   (05.02.14 13:54)
> Докажите кодом.

Вот так бы сразу и сказал. А то разёл тут философию.


 
Alex80   (2014-02-06 06:04) [21]

Посмотрел, что:

TGLSceneViewer = class(TWinControl)

А у TWinControl есть события OnKeyDown, OnKeyPress, OnKeyUp . Открыл их. Прицепил к ним код.

Но всё равно когда нажимаю на стрелки - OnKeyDown и OnKeyPress не проходит. Ну, так как их включить-то? Мастера?


 
Alex80   (2014-02-06 06:06) [22]

Посмотрел, что:

TGLSceneViewer = class(TWinControl)

А у TWinControl есть события OnKeyDown, OnKeyPress, OnKeyUp . Открыл их. Прицепил к ним код.

Но всё равно когда нажимаю на стрелки - OnKeyDown и OnKeyPress не проходит. Ну, так как их включить-то? Мастера?


 
sniknik ©   (2014-02-06 08:02) [23]

> Ну, так как их включить-то?
убрать то, что их "выключает"... разве не очевидно? или переписывать на низком уровне. или обходится тем, что все таки работает, не смотря на твои заявления.


 
brother ©   (2014-02-06 08:56) [24]

KeyPreview:= True; у формы?


 
Alex80   (2014-02-06 12:19) [25]


> brother ©   (06.02.14 08:56) [24]
>
> KeyPreview:= True; у формы?

Конечно.


 
Alex80   (2014-02-06 12:32) [26]

Ещё один не работающий код.

http://www.pascalgamedevelopment.com/showthread.php?3712-%28OnKeyPress%29-Is-arrow-key-pressed


> sniknik ©   (06.02.14 08:02) [23]
>
> > Ну, так как их включить-то?
> убрать то, что их "выключает"... разве не очевидно? или
> переписывать на низком уровне. или обходится тем, что все
> таки работает, не смотря на твои заявления.

А что их выключает? А как переписать на низком уровне? Какой код?


 
sniknik ©   (2014-02-06 13:56) [27]

>> KeyPreview:= True; у формы?
> Конечно.
это не уточняющий вопрос был, это ответ. альтернатива т.сказать.

> А что их выключает?
> TActionList, создаю в нём экшены на нажатия стрелок
акции по сути централизованы, сделаны чтобы в них писать код, а в остальных местах и просто указывать.

> А как переписать на низком уровне?
ну, найти место/событие/сообщение которое перехватывают акции, и "встроится" до них, или вместо них, написать свою систему сообщений в конце концов. вариантов много... и все они глупые (вместо изучения и использования системы пытаться ее менять не зная всегда глупо).


 
Inovet ©   (2014-02-06 17:55) [28]

Я вот не зная ничего о TGLSceneViewer, предположим — беру и назначаю обработку неких клавиш, которые должны использоваться в этом самом компоненте на этой самой форме. Какой в этом смысл? Нажимаю клавиши курсора — в одном месте формы происходит одно, в другом другое. Что-то в этом неправильно.


 
Alex80   (2014-02-06 21:32) [29]

Вот так советуют отлавливать нажатия на клавиши.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
 private

 public
   procedure WMKeyDown(var Message : TWMKeyDown); message WM_KEYDOWN;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMKeyDown(var Message: TWMKeyDown);
begin
 if message.CharCode = VK_LEFT then
   form1.Left := form1.Left- 2;
 if message.CharCode = VK_RIGHT then
   form1.Left := form1.Left+ 2;
 if message.CharCode = VK_UP then
   form1.top := form1.top- 2;
 if message.CharCode = VK_DOWN then
   form1.top := form1.top+ 2;
end;

end.


Вставил эту процедуру в свою TForm1, но не проходят нажатия. Просто не вызывается функция WMKeyDown . Почему?

Похоже не меня одного достала эта проблема.


 
MBo ©   (2014-02-06 22:22) [30]

Дядя Петя Белов тут пару слов набросал про отлов клавиш:
http://edn.embarcadero.com/article/38447

Можно также посмотреть обсуждения, ссылающиеся на название этой статьи


 
Alex80   (2014-02-07 08:51) [31]


> MBo ©   (06.02.14 22:22) [30]
> Дядя Петя Белов тут пару слов набросал про отлов клавиш:
> http://edn.embarcadero.com/article/38447

Хочется пожелать Пете освоить русский язык.

Чего нам оттуда может пригодиться?


 
brother ©   (2014-02-07 09:08) [32]

> Чего нам оттуда может пригодиться?

а ты не принаглел уже?
иди прочитай, там поговорим...


 
Alex80   (2014-02-07 09:53) [33]


> а ты не принаглел уже?
> иди прочитай, там поговорим...

А по поводу [29] разве уже поговорили?
Почему не работает?


 
brother ©   (2014-02-07 10:29) [34]

[29] все работает...


 
sniknik ©   (2014-02-07 10:34) [35]

> [29] все работает...
у тебя да(и у всех да), а ты "сломай" как топикастер, после будешь говорить. ;)


 
sniknik ©   (2014-02-07 10:36) [36]

p.s. да и у него все работает... работает именно так, как положено используемым им компонентам, но не так как ему хочется.


 
Alex80   (2014-02-07 23:57) [37]

Кстати, а зачем вообще придумали разделение на KeyPress и KeyDown? Для чего?


 
Германн ©   (2014-02-08 02:27) [38]


> Alex80   (07.02.14 08:51) [31]
>
>
> > MBo ©   (06.02.14 22:22) [30]
> > Дядя Петя Белов тут пару слов набросал про отлов клавиш:
>
> > http://edn.embarcadero.com/article/38447
>
> Хочется пожелать Пете освоить русский язык.

Желай сколько тебе влезет.

> Чего нам оттуда может пригодиться?

Всё. От начала и до конца. Если научишься читать то, что пишут специалисты высшего класса. В т.ч. и на английском. И даже в первую очередь на английском.

> Alex80   (07.02.14 23:57) [37]
>
> Кстати, а зачем вообще придумали разделение на KeyPress
> и KeyDown? Для чего?

Ооо. В таком случае надо начинать с чтения букварей. Причём не только по Дельфи и по Windows. Но и вообще по компьютерам.


 
Alex80   (2014-02-08 03:04) [39]


> Германн ©   (08.02.14 02:27) [38]

Удивительно как много можно написать никому не нужного текста.


 
Германн ©   (2014-02-08 03:30) [40]


> Alex80   (08.02.14 03:04) [39]
>
>
> > Германн ©   (08.02.14 02:27) [38]
>
> Удивительно как много можно написать никому не нужного текста.
>
>  

Угу. Только заметь. Не я это начал, а ты.



Страницы: 1 2 вся ветка

Текущий архив: 2015.04.05;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.006 c
2-1391396543
Alex80
2014-02-03 07:02
2015.04.05
Как отловить нажатия на стрелки, не блокируя их?


4-1270793885
Kolan
2010-04-09 10:18
2015.04.05
Нe удается открыть вирт. ком-порт, работающий через usbser.sys


15-1405510044
Kerk
2014-07-16 15:27
2015.04.05
Behavior-driven development (BDD) в Delphi


15-1407775454
Друг
2014-08-11 20:44
2015.04.05
О QuickSort не говори


15-1408554196
Пашка.
2014-08-20 21:03
2015.04.05
Зачем нужны Regexp-ы?