Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.15;
Скачать: CL | DM;

Вниз

Как из дочернего окна узнать, что готовится закрытие главного?   Найти похожие ветки 

 
Aleksandr.   (2005-12-12 16:26) [0]

У главного и дочерних окон программы есть свои обработчики OnCloseQuery. Не знаю, с чем это связано, но при закрытии главного окна оно сначала вызывает все OnCloseQuery дочерних окон, которые вполне выставлять CanClose в true, но при этом в главном окне CanClose может вернуться false, и в программе получается неприглядная картина - дочерние окна выглядят полузакрытыми (выполнены все операции в OnCloseQuery, но FormClose не произошло).
Я так и не понял последовательности закрытия главного и дочерних окон, но как вариант решения проблемы могу перенести из главного окна всю обработку OnCloseQuery. Но тогда, соответственно, дочернему окну надо знать, вызвано его OnCloseQuery в связи с выходом программы или оно закрывается отдельно. Как это можно выяснить? MainForm.ComponentState - никаких флагов не содержит.


 
Tor ©   (2005-12-12 16:56) [1]

Заведи глобальную переменную в которой на OnCloseQuery главной формы будеш ставить true. А в дочерних проверять эту переменную и количество открытых окон. Но вообще так и не понятна суть вопроса, зачем тебе это? По идеи когда закрывают окна то они должны закрыться, зачем мудрить. :)


 
Aleksandr.   (2005-12-12 17:12) [2]

Tor © :
Переменная не прокатит по простой причине - OnCloseQuery главного окна вызывается ПОСЛЕ OnCloseQuery дочерних. Было бы иначе - не было бы проблемы. А зачем это нужно - никогда не видели, как при закрытии Word с несохраненным документом он спрашивал, не стоит ли сохранить документ?


 
Игорь Шевченко ©   (2005-12-12 17:20) [3]


> А зачем это нужно - никогда не видели, как при закрытии
> Word с несохраненным документом он спрашивал, не стоит ли
> сохранить документ?


Word делает это иначе. У него есть коллекция документов (не окон, а объектов), которую он опрашивает, если там есть несохраненные, он спрашивает.


 
Tor ©   (2005-12-12 17:22) [4]

Ну так что тебе надо? Сохранять документ, а юзер жмет отмену и получается все закрыто и юзер в обломе?
Диалог сохранения в дочернее окно еслит отмена то в глобальной переменной false потом в главной форме проверяеш и действуеш соответственно.
Ты толком проблему не описал. Опиши че те надо и что происходит(поведение программы).


 
Aleksandr.   (2005-12-12 20:16) [5]

Tor ©  :

>  Сохранять документ, а юзер жмет отмену и получается все
> закрыто и юзер в обломе?

Именно так.


> Ты толком проблему не описал


Млин, цитирую:
дочернему окну надо знать, вызвано его OnCloseQuery в связи
с выходом программы или оно закрывается отдельно. Как это
можно выяснить? MainForm.ComponentState - никаких флагов
не содержит

В этом нет формулировки, что мне надо?


 
Alexander Panov ©   (2005-12-12 21:54) [6]

Основная форма:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
       procedure WProc(var Message: TMessage);
 end;

var
 Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   Form2.Show;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Form1.WindowProc :=  WProc;
end;

procedure TForm1.WProc(var Message: TMessage);
begin
 if Message.Msg = WM_Close then
 begin
   SendMessage(Form2.Handle,WM_CLOSE,1,0);
 end;
 WndProc(Message);
end;

end.


Вторая форма:

unit Unit2;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm2 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
       procedure WProc(var Message: TMessage);
 end;

var
 Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.WProc(var Message: TMessage);
begin
 if Message.Msg = WM_Close then
 begin
   if Message.WParam=1 then
   begin
       if Form2.Showing then ShowMessage("Запрос на закрытие приложения");
   end
   else ShowMessage("Запрос на закрытие формы 2");
 end;
 WndProc(Message);
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
   Form2.WindowProc :=  WProc;
end;

end.



Страницы: 1 вся ветка

Текущий архив: 2006.01.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.056 c
8-1123651552
Grief
2005-08-10 09:25
2006.01.15
OpenGL - буфер накопления


3-1132176634
Yrtimd
2005-11-17 00:30
2006.01.15
Firebird + FIBPlus - обработка ошибок подключения


14-1135166865
konda
2005-12-21 15:07
2006.01.15
Глюк в Outlook Express


14-1134920396
begin...end
2005-12-18 18:39
2006.01.15
С Днём рождения! 18 декабря


14-1134748697
(CHALING 32)S K i N E R
2005-12-16 18:58
2006.01.15
Дам вам один совет!