Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Фрейм, PaintBox и клавиатура... [D6, Win2k]


Страницы:   1 2

tunguss ©   (2005-05-20 18:05:00) 

Вот есть вопрос к вам, уважаемые господа.

Описываю ситуацию.

Есть фрейм (он обязателен по умолчанию - без него никуда :) ) - разрабатывается отдельно, но тестируется на форме. Наследник фрейма, естественно.

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

Итак. Проблема жутко тривиальная - фрейму не поймать нажатые клавиши. Все. Причем с мышью все в порядке (она как раз ловится PaintBox'ом).

Форма их принимать не может, потому что тогда проект не будет соответствовать спецификации. Все способы с хуками, переопределениями KeyDown и поимкой messag'ей - перепробованы.

Вполне логично предположить, что PaintBox берет на себя эти самые messag'ы. Но у PaintBox'а нет ивентов-обрабочиков клавиатуры!

Вот так. Прошу высказывать возможные решения проблемы. Поскольку есть вероятность, что для ее решения требуются минимальные усилия, которые либо просто не приходят в голову либо сказывается недостаток опыта :)


tunguss   (2005-05-30 15:49:00) [1]

И еще благодарю rOOSe, VladimirB - за проявление интереса к сему вопросу....

...прям как фильм снял :).


tunguss   (2005-05-30 14:23:00) [2]

P.P.S. и не пугайтесь слова Custom в этом примере, как сделал это я - это делается для наследников TWinControl, Custom-компоненты, как мы помним, делают это сами ::).


tunguss   (2005-05-30 14:21:00) [3]

УРА. Все. Тема закрыта. Делаем так:

protected
...
procedure WMGetDlgCode (var msg: TMessage); message WM_GETDLGCODE;
...

implementation

procedure TMyCustomControl.WMGetDlgCode(var msg: TMessage);
begin
inherited;
msg.Result := msg.Result + DLGC_WANTARROWS
end;


Покорнейше благодарю Юрия Зотова и Просто Джо.

P.S. Тема-то закрыта, но мы-то все равно знаем, что это баг /:))))


tunguss   (2005-05-30 12:31:00) [4]

вот эти две темы также относятся к означенной проблеме:

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1117163646&n=12
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1109751986&n=12


tunguss   (2005-05-30 12:05:00) [5]

[22] к флуду естественно не относится, спасибо Юрий. Но к сожалению в данном случае предложенный там выход нам не позволен заказчиком :).


tunguss   (2005-05-30 12:00:00) [6]

тема насчет бага все еще открыта. вышеочначенный флуд не считается - к решению мы не пришли :(.


Юрий Зотов   (2005-05-27 10:48:00) [7]

> tunguss

На всякий случай загляните сюда, вдруг поможет:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1109751986&n=12


tunguss   (2005-05-26 19:27:00) [8]

может в чат пойдем :)) ?. а то все мои идеи уже теряются куда-то :)). я там :)


tunguss   (2005-05-26 19:27:00) [9]

может в чат пойдем :)) ?. а то все мои идеи уже теряются куда-то :)). я там :)


rOOse   (2005-05-26 19:24:00) [10]

надо поробовать создать свой компонент на основе  TFrame и попробовать там


tunguss   (2005-05-26 19:13:00) [11]

не заметил. ну ведь значит точно баг :). читаем хелп:

The OnKeyDown handler can respond to all keyboard keys, including function keys and keys combined with the Shift, Alt, and Ctrl keys, and pressed mouse buttons.

Круто, да? :)


rOOse   (2005-05-26 18:23:00) [12]

а ты заметил что ctrl shift f1-f12 etc тоже не работают


tunguss   (2005-05-26 18:22:00) [13]

это к чему? :)


rOOse   (2005-05-26 18:16:00) [14]

кто помнит скан коды или ASCII клавиш?


tunguss   (2005-05-26 18:10:00) [15]

абсолютно согласен - но КУДА :)))) ?????? И как его поймать-то :)))... KeyPreview к стрелочкам не относится. SetFocus, как видишь, не пашет. Можно было бы ловить стрелочку и принудительно возвращать фокус контролу - но ее не поймать, да и это некрасиво как-то. В багах ничего плохого - просто лучше чтобы о них где-то было объявлено чтобы проггеры могли сказать заказчику "извините, вот зайдите на borland.com и посмотрите - это баг, так что уж просим не винить нас, что мы извращаемся по-всякому чтобы его обойти"...


rOOse   (2005-05-26 18:05:00) [16]

ну не на форму но фокус теряется это точно


tunguss   (2005-05-26 17:51:00) [17]

безысходность это всегда баг. А тут нет выхода :). Поймать стрелочки. По крайней мере я его не вижу, а смотрел растопырив все глаза.


tunguss   (2005-05-26 17:49:00) [18]

> to jack128:

 а если на форме нет контролов? :) (см. to rOOse)

> to rOOse:

 не должен фокус переходить на форму. Запусти допустим Settings > Control Panel > Mouse (чтобы был достойный пример задавших такие правила) и пожамкай на Tab. Перешел хоть раз фокус на форму? :) Теперь потыркай стрелочки. В разных разделах. Перешел фокус? :) И даже если так - перед потерей фокуса должна пойматься хотя бы последняя клавиша.


rOOse   (2005-05-26 17:35:00) [19]

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


jack128   (2005-05-26 17:17:00) [20]

проверять лениво, но скорее всего просто при нажатии стрелки фокус сместился с фрейма на какой то другой контрол...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо