Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закрытие формы по нажатии кнопки Esc 
V
    Опции темы
Нитонисе
Дата 7.1.2013, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Закрываю таким образом дочерние формы. Обрабатываю событие формы OnKeyPress, при этом KeyPreview = true.
Код

void __fastcall TForm2::FormKeyPress(TObject *Sender, wchar_t &Key)
{
    if (Key == VK_ESCAPE) this->Close();
}
Странно, что этот код срабатывает, но только один раз. Потом если снова показать форму Form2 и нажать Esc - она уже не закрывается. Есть еще одна дочерняя форма Form3, которая всегда закрывается по Esc. В чем может быть причина такого различного поведения? На Form2 у меня панель инструментов с кнопками и TWebBrowser на всю форму. На Form3 - панель, комбобоксы, лейблы и кнопки.
PM MAIL   Вверх
artsb
Дата 7.1.2013, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Нитонисе @  7.1.2013,  17:00 Найти цитируемый пост)
Странно, что этот код срабатывает, но только один раз. Потом если снова показать форму Form2 и нажать Esc - она уже не закрывается. Есть еще одна дочерняя форма Form3, которая всегда закрывается по Esc. В чем может быть причина такого различного поведения? На Form2 у меня панель инструментов с кнопками и TWebBrowser на всю форму. На Form3 - панель, комбобоксы, лейблы и кнопки. 

А клавиша обрабатывается второй раз или нет? У меня была похожая проблема с DBGrid: когда фокус был на нём - горячие клавиши не обрабатывались. Пришлось использовать обработчик DBGridKeyPress(). Также, возможно, что эту клавишу перехватывает TWebBrowser. Например, в FireFox'е клавиша Esc - это прервать загрузку страницы.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 7.1.2013, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(artsb @  7.1.2013,  17:41 Найти цитируемый пост)
А клавиша обрабатывается второй раз или нет?

Нет. Срабатывает только однократно. А как TWebBrowser может перехватывать нажатие клавиши, если KeyPreview формы равно true и по идее именно форма первой ловит все события.
PM MAIL   Вверх
artsb
Дата 7.1.2013, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Нитонисе @  7.1.2013,  17:55 Найти цитируемый пост)
А как TWebBrowser может перехватывать нажатие клавиши, если KeyPreview формы равно true и по идее именно форма первой ловит все события. 

Интересный вопрос, но тем не менее... Проверьте, срабатывает KeyPress у TWebBrowser.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 7.1.2013, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(artsb @  7.1.2013,  18:10 Найти цитируемый пост)
Проверьте, срабатывает KeyPress у TWebBrowser.

Так у этого компонента нет такого события.
PM MAIL   Вверх
Нитонисе
Дата 7.1.2013, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Вот тестовый проект, имитирующий проблему. Очевидно есть зависимость от того, загружаю ли я в WebBrowser контент. Если не загружаю - то все срабатывает. А если загружаю Form2->WebBrowser1->Navigate(WideString("about:blank")); - то срабатывает только однократно.

Это сообщение отредактировал(а) Нитонисе - 7.1.2013, 18:53

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  CloseOnESC.zip 86,91 Kb
PM MAIL   Вверх
artsb
Дата 7.1.2013, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Так оно и есть. WebBrowser перехватывает ESC. Если добавить на форму ещё один контрол и перед нажатием ESC передать фокус ему, то всё ОК. Дело в том, что WebBrowser - это обёртка над COM-объектом (типо как MS Word, Excel и т.п.). По сути, это приложение в приложении. У него есть свои обработчики. Единственный выход - перед нажатием ESC - передавать фокус.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 7.1.2013, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(artsb @  7.1.2013,  20:16 Найти цитируемый пост)
Так оно и есть. WebBrowser перехватывает ESC. Если добавить на форму ещё один контрол и перед нажатием ESC передать фокус ему, то всё ОК. Дело в том, что WebBrowser - это обёртка над COM-объектом (типо как MS Word, Excel и т.п.). По сути, это приложение в приложении. У него есть свои обработчики. Единственный выход - перед нажатием ESC - передавать фокус.

Но ведь если в браузер не загружен контент, то форма закрывается всегда. Может стоит как-то перед Esc выгружать контент, придавая компоненту начальное состояние?

Добавлено через 10 минут и 54 секунды
Со сменой фокуса не ясно в какой момент ее выполнить. У TWebBrowser нет события OnKeyPress. Наверное надо как-то запрещать этому компоненту получать фокус.
PM MAIL   Вверх
artsb
Дата 7.1.2013, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Нитонисе @  7.1.2013,  21:30 Найти цитируемый пост)
Но ведь если в браузер не загружен контент, то форма закрывается всегда.

Ещё не факт, что в этот момент уже создан COM-объект. Возможно, это просто VCL обёртка отображается и все.

Цитата(Нитонисе @  7.1.2013,  21:30 Найти цитируемый пост)
Наверное надо как-то запрещать этому компоненту получать фокус. 

Я же говорил, что это приложение в приложении получается. Никак не запретишь ему этого делать.

Фокус можно перекидывать либо сразу после Navigate(), но тут есть проблема - пользователь может тыкнуть по странице. Либо завести таймер, который этим займётся smile


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 7.1.2013, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(artsb @  7.1.2013,  22:14 Найти цитируемый пост)
Либо завести таймер, который этим займётся

Каждые 5 секунд убирать фокус? smile
PM MAIL   Вверх
artsb
Дата 7.1.2013, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Можно и так. Но я думаю, что не будет ничего страшного, если даже будет 2 сек. smile


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 7.1.2013, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Можно использовать компоненты TActionList или TMainMenu. Добавить в него действие и установить у него свойство ShortCut = Esc.
PM   Вверх
Нитонисе
Дата 7.1.2013, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(586 @  7.1.2013,  22:50 Найти цитируемый пост)
Можно использовать компоненты TActionList или TMainMenu. Добавить в него действие и установить у него свойство ShortCut = Esc.

Добавил компонент TActionList. Добавл действие Action1, установил его свойство ShortCut=Esc. Что делать дальше не знаю, потому что с этим компонентом никогда не работал smile В таком виде он видно не работает. Повесил действие Action1 на форму - теперь она по Esc закрывается. Но не могу дать фокус компоненту WebBrowser. При клике на нем мышкой звучит сигнал. Надо подумать, может это и не плохо, что браузер не может получить фокус. Убрать бы хотябы этот звуковой сигнал.
PM MAIL   Вверх
586
Дата 7.1.2013, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(Нитонисе @  8.1.2013,  00:09 Найти цитируемый пост)
Что делать дальше не знаю, потому что с этим компонентом никогда не работал

Установи у Action обработчик OnExecute.

Цитата(Нитонисе @  8.1.2013,  00:09 Найти цитируемый пост)
Но не могу дать фокус компоненту WebBrowser.

Из-за TActionList? У меня все нормально работает.
PM   Вверх
Нитонисе
Дата 7.1.2013, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(586 @  7.1.2013,  23:20 Найти цитируемый пост)
Установи у Action обработчик OnExecute.
Хм. Работает smile Только я не понимаю механизма работы. TAction - это что-то вроде невизуального компонента, который что-то делает. При этом то что он делает записано в OnExecute. А активируется OnExecute в данном случае нажатием Esc? Тогда странно, почему TAction знает что нажата Esc, а форма не знает.


Цитата(586 @  7.1.2013,  23:20 Найти цитируемый пост)
Из-за TActionList? У меня все нормально работает.

Это был такой эффект если действие Action1 прописать в свойстве формы Action.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.