Закрытие формы по клавише (проблема)
Модератор: Модераторы
Закрытие формы по клавише (проблема)
Да-да, тема избита. Но у меня немного другая проблема.
Знаю как закрыть окно по клавише. Как перехватывать и т.д. Проблема в другом.
Есть 3 формы. Из 1 (главная форма программы) формы можно вызвать 2 и 3 форму. 2 и 3 формы закрываются по esc. Если вызвать из 2 формы 3 и нажать esc то зыкрывается обе, но при этом 1 форма недоступна. Эффек как бу-то открыто окно и оно не дает работать с главной (1) формой. Но если еще раз нажать esc 1 форма становится доступной. Вот собственно и не понятно как сделать достопной 2 форму, когда в 3 форме нажато клавиша esc.
Есть идеи?
Знаю как закрыть окно по клавише. Как перехватывать и т.д. Проблема в другом.
Есть 3 формы. Из 1 (главная форма программы) формы можно вызвать 2 и 3 форму. 2 и 3 формы закрываются по esc. Если вызвать из 2 формы 3 и нажать esc то зыкрывается обе, но при этом 1 форма недоступна. Эффек как бу-то открыто окно и оно не дает работать с главной (1) формой. Но если еще раз нажать esc 1 форма становится доступной. Вот собственно и не понятно как сделать достопной 2 форму, когда в 3 форме нажато клавиша esc.
Есть идеи?
Я не телепат. Покажите кусок кода, как вы вызываете из основной формы 2 и 3 формы, а также как вы во 2 и 3 форме отлавливаете нажатие esc и закрытие формы по нажатию esc.
да, чёт я тормазнул...
почему KeyDown, а не KeyPres? еще буду отлавливать Shift/Alt/Ctrl.
Код: Выделить всё
// Вызов 2 формы
procedure TMain.MAddUserClick(Sender: TObject);
begin
WAddEditUser.Tag := 0;
WAddEditUser.ShowModal;
end;Код: Выделить всё
// Взов 3 формы из 2
procedure TWAddEditUser.LicListDblClick(Sender:TObject);
begin
WAddEditLic.Tag := StrToInt(LicList.Items[LicList.Items.IndexOf(LicList.Selected)].Caption);
WAddEditLic.ShowModal;
end; Код: Выделить всё
// Во 2 форме
procedure TWAddEditUser.FormKeyDown(Sender:TObject;var Key:Word;Shift:
TShiftState);
begin
// Закрытие формы по нажанию ESCAPE.
if Key = 27 then
begin
Key := 0;
Close;
end;
end;Код: Выделить всё
// в 3 форме
procedure TWAddEditLic.FormKeyDown(Sender:TObject;var Key:Word;Shift:
TShiftState);
begin
// Закрытие формы по нажанию ESCAPE.
if Key = 27 then
begin
Key := 0;
Close;
end;
end;почему KeyDown, а не KeyPres? еще буду отлавливать Shift/Alt/Ctrl.
- GAMER
- энтузиаст
- Сообщения: 627
- Зарегистрирован: 06.08.2008 13:41:07
- Откуда: Ужгород-Днепр, Украина
- Контактная информация:
По ходу, а как отловить, что форма закрывалась через крестик в правом верхнем углу, а не через Close?
У меня, что-то через KeyPres глючило (дважды обрабатывалось), сделал через KeyDown.
У меня, что-то через KeyPres глючило (дважды обрабатывалось), сделал через KeyDown.
GAMER
Через крестик тот же эффект
Через крестик тот же эффект
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
GAMER, как бы это своими словами описать... Короче что по крестику закрывай, что по Alt+F4, что через пункт системного меню, что на иконке слева в заголовке открывается - все едино. А конкретно по крестику - как вариант ставить хук на мышь и сравнивать координаты/состояние оной и закрываемой формы. 
Вопрос наверное в том, как отловить пришла команда о закрытии формы от ОС или от самого приложения? Только зачем? Результат все равно вроде одинаковый.
Вопрос наверное в том, как отловить пришла команда о закрытии формы от ОС или от самого приложения? Только зачем? Результат все равно вроде одинаковый.
Так, ну а по моему вопросу есть предложения? Как так получается что вызывая Close в одной форме получается петрушка в другой.
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
modjo писал(а):Так, ну а по моему вопросу есть предложения? Как так получается что вызывая Close в одной форме получается петрушка в другой.
Постарайся уйти от модальности в формах. Вызываешь модальную форму из модальной - оттого и "петрушка". ИМХО.
Какие альтернативы? Кроме Show, потому как неудобно юзать окна после этого. Да и желательно блокировать предыдущее окно чтоб делов неправильных не натворить.
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
modjo писал(а):Какие альтернативы? Кроме Show, потому как неудобно юзать окна после этого. Да и желательно блокировать предыдущее окно чтоб делов неправильных не натворить.
Ни каких. Форма или модальная или не модальная.
Вот в этой теме viewtopic.php?f=5&t=5368 как-то продолжительная дискуссия по этому поводу была. Рекомендуется к ознакомлению.
- GAMER
- энтузиаст
- Сообщения: 627
- Зарегистрирован: 06.08.2008 13:41:07
- Откуда: Ужгород-Днепр, Украина
- Контактная информация:
dunin писал(а):GAMER
Вопрос наверное в том, как отловить пришла команда о закрытии формы от ОС или от самого приложения? Только зачем? Результат все равно вроде одинаковый.
Вы правы, нужно отловить, как была закрыта форма.
Проблема, скорее, через неверный выбор идеологии. Просто, при нажатии на разные кнопки, выполняются разные действия, после чего илет Close; А через крестик отловить действие - не получилось. Наверное, нужно сделать какой-то параметр, значение которого будет меняться в зависимости от того, какая кнопка была нажата (и останется начальное, если крестик). А в onClose уже обрабатывать, в зависимости от значения этого параметра.
dunin
Тема конечно интересная, но не в ней дело явно. Мне то как раз и надо из одного окна вызвать другое. По другому смысол теряется.
Тема конечно интересная, но не в ней дело явно. Мне то как раз и надо из одного окна вызвать другое. По другому смысол теряется.
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
modjo писал(а):dunin
Тема конечно интересная, но не в ней дело явно. Мне то как раз и надо из одного окна вызвать другое. По другому смысол теряется.
Все что приходит в голову:
Код: Выделить всё
// в 3 форме
procedure TWAddEditLic.FormKeyDown(Sender:TObject;var Key:Word;Shift:
TShiftState);
begin
// Закрытие формы по нажанию ESCAPE.
if Key = 27 then
begin
Key := 0;
WAddEditLic.Close;
WAddEditUser.BringToFront; // !!!
end;
end;Т.е. вы предлагаете закрывать обо окна при нажатии esc? Ну та, тогда проблем не будет с тем что приложение заблокировано. Но тогда вообще весь смысл теряется. В третьей форме какраз предлагается произвести действия важные для пользователя. А во второй другие настройки которые по смыслу не должны присутстовать в 3 форме. Короче как не крути а выходит именно так как есть. Проблема только в петрушке с закрытием окон.
Да и не помогает установка z порядка окон (BringToFront (мне кажется вы немного напутали с тем где это надо указать)). Кстати. Заметил такой эффект: когда 2 форма пропадает и если нажать на кнопку в панеле задач, то 1 форма сварачивается и я вижу вторую форму. Если опять нажать появляется первая форма, но тогда приложение недоступно. Надеюсь понятно объяснил.
Да и не помогает установка z порядка окон (BringToFront (мне кажется вы немного напутали с тем где это надо указать)). Кстати. Заметил такой эффект: когда 2 форма пропадает и если нажать на кнопку в панеле задач, то 1 форма сварачивается и я вижу вторую форму. Если опять нажать появляется первая форма, но тогда приложение недоступно. Надеюсь понятно объяснил.
