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

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

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

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

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

Сообщение modjo »

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

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

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

Есть идеи?
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Сообщение kosteek »

Я не телепат. Покажите кусок кода, как вы вызываете из основной формы 2 и 3 формы, а также как вы во 2 и 3 форме отлавливаете нажатие esc и закрытие формы по нажатию esc.
modjo
новенький
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Сообщение modjo »

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

Код: Выделить всё

// Вызов 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
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

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

У меня, что-то через KeyPres глючило (дважды обрабатывалось), сделал через KeyDown.
modjo
новенький
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Сообщение modjo »

GAMER
Через крестик тот же эффект
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

2 modjo
Я не Вашу ошибку имел в виду. Просто не хотел новую тему открывать. Можно ли как-то отловить, что закрытие через крестик шло?
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

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

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

Сообщение modjo »

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

Сообщение dunin »

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

Постарайся уйти от модальности в формах. Вызываешь модальную форму из модальной - оттого и "петрушка". ИМХО.
modjo
новенький
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Сообщение modjo »

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

Сообщение dunin »

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

Ни каких. Форма или модальная или не модальная.
Вот в этой теме viewtopic.php?f=5&t=5368 как-то продолжительная дискуссия по этому поводу была. Рекомендуется к ознакомлению.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

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


Вы правы, нужно отловить, как была закрыта форма.
Проблема, скорее, через неверный выбор идеологии. Просто, при нажатии на разные кнопки, выполняются разные действия, после чего илет Close; А через крестик отловить действие - не получилось. Наверное, нужно сделать какой-то параметр, значение которого будет меняться в зависимости от того, какая кнопка была нажата (и останется начальное, если крестик). А в onClose уже обрабатывать, в зависимости от значения этого параметра.
modjo
новенький
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Сообщение modjo »

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

Сообщение dunin »

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

Сообщение modjo »

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

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