Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1135454569
mixa
2005-12-24 23:02
2006.01.15
пустая папка


8-1123660039
grant
2005-08-10 11:47
2006.01.15
Подскажите, если кто знает. Как писать захвать изображение с каме


10-1111149870
dewersia
2005-03-18 15:44
2006.01.15
помогите с com+


6-1128069223
antoxa2005
2005-09-30 12:33
2006.01.15
ПОМОГИТЕ ! Как передать данные от одного приложения по сети друго


1-1134136957
diwww
2005-12-09 17:02
2006.01.15
Как сделать недоступной кнопку Х (закрыть окно) в заголовке окна?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский