Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MDI, Как отловить нажатие 'Закрыть' 
:(
    Опции темы
Dapo
  Дата 9.7.2002, 03:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В MDI приложении требуется отловить нажатие оконной кнопки 'Close' (окно MdiChild) и произвести какие-нибудь действия?
Спасибо.
PM MAIL   Вверх
Serhio
  Дата 9.7.2002, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Hi !
  MDIChild как и любое другое окно имеет событие FormClose,
  Его и надо обработать.
Удачи.
(пример выслал на мыло)
PM MAIL   Вверх
Vit
Дата 9.7.2002, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Обрабатывай OnCloseQuery


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Dapo
Дата 10.7.2002, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо, спасибо. Но я вообще-то "не первый год за мужем" :)
OnClose и OnCloseQuery я проходил. У меня такая проблема: Дочернее окно может быть закрыто и другими способами (извне как бы). И вот на разные случаи должно происходить что-то разное, в том числе и в случае, когда я закрываю форму непосредственно через значок "закрыть". Проще говоря, есть на главной форме кнопка Button1 OnClick которой, ну скажем MDIChildForm.Close; Нажал я на кнопку и закрыл доч.форму (Action:=caFree) и получил сообщение 'Окно закрыто по кнопке Button1', а если я нажал значок на форме (ее оконную кнопку "закрыть"), то получил сообщение 'Окно закрыто системно' В общем в этом духе.
PM MAIL   Вверх
Fantasist
Дата 10.7.2002, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Единственно, что приходит в голову, это либо следить за мышкой, и тогда легко узнать, что узер нажал на крестик, либо когда у тебя окно закрывается как-то по другому присылать свои сообщения и их обрабатывать.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Free
Дата 11.7.2002, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Может, я чего-то недопонял, но при нажатии Button1 - OnClose а при нажатии "кнопки с крестиком" - OnCloseQuery. Почему бы не написать:
Код

procedure Form1.OnClose(...bla-bla..);
begin
Application.MessageBox('You press a Button1', 'Test', 1);
Close;
end;

Procedure Form1.OnCloseQuery (...bla-bla...);
begin
Application.MessageBox('You press a "Krestik" :-)', 'Test', 1);
CanClose:=True;
end;

PM MAIL ICQ   Вверх
МММ
Дата 11.7.2002, 02:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

procedure Form1.OnClose(...bla-bla..);
begin
Application.MessageBox('You press a Button1', 'Test', 1);
Close;
end;

Procedure Form1.OnCloseQuery (...bla-bla...);
begin
Application.MessageBox('You press a "Krestik" :-)', 'Test', 1);
CanClose:=True;
end;


Free ТАК НЕ ПОЙДЕТ!!!!!
можешь сделать так или глобальную переменную, или через свойство
form.tag
первоначально она равна 0

Код

procedure Form1.buttonclick();
begin
form.tag:=1;
mdiform.close;
end;


procedure MdiForm.OnClose(...bla-bla..);
begin
IF form.tag=1  then
Application.MessageBox('You press a Button', 'Test', 1)
else
Application.MessageBox('You press a other key', 'Test', 1);
form.tag:=0;
end;


Вроде должно работать  :)


--------------------
PM MAIL   Вверх
Dapo
Дата 17.7.2002, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот решение касается не только MDI-формы

type TForm1=class(TForm)
.........
protected
   procedure WMSYSMESSAGE(var MSG:TMessage); message WM_SYSCOMMAND;
.........
procedure TChannelForm.WMSYSMESSAGE(var MSG:TMessage);
begin
 if MSG.WParam=SC_CLOSE then
    ShowMessage('системная кнопка');
 else inherited;
end;

отреагирует только тогда, когда будет нажата системная кнопка 'close';
PM MAIL   Вверх
Song
Дата 17.7.2002, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


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

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



WM_SYSCOMMAND, очевидно


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Alex101
Дата 17.7.2002, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

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



WM_SYSCOMMAND отловит только ежели закрывать руками окно,
лучше WM_DESTROY использовать, тогда везде отловишь
Дааа... надо с самого начала вопрос читать :)
Админ, пожалуй удали это - ответ не по существу...


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
Song
Дата 17.7.2002, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


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

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



Отлов WM_SYSCOMMAND предполагает отлов SC_CLOSE в качестве WParam, соответсвенно это событие возникает при любом закрытии будь то клавиатурой, будь то мышью или ещё как-то кроме как аварийном завершении соответсвующего процесса.
Если Вы точно не знаете, не надо вводить людей в неправильную инфу и создавать подземный стук.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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