Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > MDI


Автор: Dapo 9.7.2002, 03:46
В MDI приложении требуется отловить нажатие оконной кнопки 'Close' (окно MdiChild) и произвести какие-нибудь действия?
Спасибо.

Автор: Serhio 9.7.2002, 08:44
Hi !
  MDIChild как и любое другое окно имеет событие FormClose,
  Его и надо обработать.
Удачи.
(пример выслал на мыло)

Автор: Vit 9.7.2002, 16:00
Обрабатывай OnCloseQuery

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

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

Автор: Free 11.7.2002, 01:43
Может, я чего-то недопонял, но при нажатии 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;

Автор: МММ 11.7.2002, 02:59
Код

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;


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

Автор: Dapo 17.7.2002, 12:59
Вот решение касается не только 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';

Автор: Song 17.7.2002, 13:35
WM_SYSCOMMAND, очевидно

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)