Форум: "Основная";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
ВнизКак из дочернего окна узнать, что готовится закрытие главного? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.015 c