Закрытие формы по клавише (проблема)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Закрытие формы по клавише (проблема)

Сообщение modjo » 18.10.2010 12:27:54

Да-да, тема избита. Но у меня немного другая проблема.

Знаю как закрыть окно по клавише. Как перехватывать и т.д. Проблема в другом.

Есть 3 формы. Из 1 (главная форма программы) формы можно вызвать 2 и 3 форму. 2 и 3 формы закрываются по esc. Если вызвать из 2 формы 3 и нажать esc то зыкрывается обе, но при этом 1 форма недоступна. Эффек как бу-то открыто окно и оно не дает работать с главной (1) формой. Но если еще раз нажать esc 1 форма становится доступной. Вот собственно и не понятно как сделать достопной 2 форму, когда в 3 форме нажато клавиша esc.

Есть идеи?
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Закрытие формы по клавише (проблема)

Сообщение kosteek » 19.10.2010 00:00:39

Я не телепат. Покажите кусок кода, как вы вызываете из основной формы 2 и 3 формы, а также как вы во 2 и 3 форме отлавливаете нажатие esc и закрытие формы по нажатию esc.
kosteek
постоялец
 
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: Закрытие формы по клавише (проблема)

Сообщение modjo » 19.10.2010 00:12:40

да, чёт я тормазнул...

Код: Выделить всё
// Вызов 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.
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Закрытие формы по клавише (проблема)

Сообщение GAMER » 19.10.2010 00:18:46

По ходу, а как отловить, что форма закрывалась через крестик в правом верхнем углу, а не через Close?

У меня, что-то через KeyPres глючило (дважды обрабатывалось), сделал через KeyDown.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Закрытие формы по клавише (проблема)

Сообщение modjo » 19.10.2010 00:21:29

GAMER
Через крестик тот же эффект
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Закрытие формы по клавише (проблема)

Сообщение GAMER » 19.10.2010 00:23:03

2 modjo
Я не Вашу ошибку имел в виду. Просто не хотел новую тему открывать. Можно ли как-то отловить, что закрытие через крестик шло?
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Закрытие формы по клавише (проблема)

Сообщение dunin » 19.10.2010 09:14:34

GAMER, как бы это своими словами описать... Короче что по крестику закрывай, что по Alt+F4, что через пункт системного меню, что на иконке слева в заголовке открывается - все едино. А конкретно по крестику - как вариант ставить хук на мышь и сравнивать координаты/состояние оной и закрываемой формы. :)

Вопрос наверное в том, как отловить пришла команда о закрытии формы от ОС или от самого приложения? Только зачем? Результат все равно вроде одинаковый.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Закрытие формы по клавише (проблема)

Сообщение modjo » 19.10.2010 09:53:56

Так, ну а по моему вопросу есть предложения? Как так получается что вызывая Close в одной форме получается петрушка в другой.
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Закрытие формы по клавише (проблема)

Сообщение dunin » 19.10.2010 09:58:19

modjo писал(а):Так, ну а по моему вопросу есть предложения? Как так получается что вызывая Close в одной форме получается петрушка в другой.

Постарайся уйти от модальности в формах. Вызываешь модальную форму из модальной - оттого и "петрушка". ИМХО.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Закрытие формы по клавише (проблема)

Сообщение modjo » 19.10.2010 10:35:20

Какие альтернативы? Кроме Show, потому как неудобно юзать окна после этого. Да и желательно блокировать предыдущее окно чтоб делов неправильных не натворить.
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Закрытие формы по клавише (проблема)

Сообщение dunin » 19.10.2010 10:54:32

modjo писал(а):Какие альтернативы? Кроме Show, потому как неудобно юзать окна после этого. Да и желательно блокировать предыдущее окно чтоб делов неправильных не натворить.

Ни каких. Форма или модальная или не модальная.
Вот в этой теме viewtopic.php?f=5&t=5368 как-то продолжительная дискуссия по этому поводу была. Рекомендуется к ознакомлению.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Закрытие формы по клавише (проблема)

Сообщение GAMER » 19.10.2010 11:48:05

dunin писал(а):GAMER
Вопрос наверное в том, как отловить пришла команда о закрытии формы от ОС или от самого приложения? Только зачем? Результат все равно вроде одинаковый.


Вы правы, нужно отловить, как была закрыта форма.
Проблема, скорее, через неверный выбор идеологии. Просто, при нажатии на разные кнопки, выполняются разные действия, после чего илет Close; А через крестик отловить действие - не получилось. Наверное, нужно сделать какой-то параметр, значение которого будет меняться в зависимости от того, какая кнопка была нажата (и останется начальное, если крестик). А в onClose уже обрабатывать, в зависимости от значения этого параметра.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Закрытие формы по клавише (проблема)

Сообщение modjo » 19.10.2010 13:10:13

dunin
Тема конечно интересная, но не в ней дело явно. Мне то как раз и надо из одного окна вызвать другое. По другому смысол теряется.
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Закрытие формы по клавише (проблема)

Сообщение dunin » 19.10.2010 13:29:05

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;
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Закрытие формы по клавише (проблема)

Сообщение modjo » 19.10.2010 14:01:27

Т.е. вы предлагаете закрывать обо окна при нажатии esc? Ну та, тогда проблем не будет с тем что приложение заблокировано. Но тогда вообще весь смысл теряется. В третьей форме какраз предлагается произвести действия важные для пользователя. А во второй другие настройки которые по смыслу не должны присутстовать в 3 форме. Короче как не крути а выходит именно так как есть. Проблема только в петрушке с закрытием окон.

Да и не помогает установка z порядка окон (BringToFront (мне кажется вы немного напутали с тем где это надо указать)). Кстати. Заметил такой эффект: когда 2 форма пропадает и если нажать на кнопку в панеле задач, то 1 форма сварачивается и я вижу вторую форму. Если опять нажать появляется первая форма, но тогда приложение недоступно. Надеюсь понятно объяснил.
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 52

Рейтинг@Mail.ru