![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Фрейм, PaintBox и клавиатура... [D6, Win2k]
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]проверять лениво, но скорее всего просто при нажатии стрелки фокус сместился с фрейма на какой то другой контрол...