Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2011, 12:56   #1
Armorer
Подтвердите свой е-майл
 
Регистрация: 07.04.2007
Сообщений: 120
По умолчанию Закрытие дочерних MDI форм

Столкнулся с такой проблемой.

В MDI приложении открыто много дочерних окон. У каждой в CloseQuery выдается запрос на подтверждение закрытия формы. Если закрывать главную форму, то сначала вызываются обработчики CloseQuery дочерних и если хотя бы один из них возвращает false, то программа не закроется.

Как можно сделать чтобы
1. При закрытии главной формы обработчики CloseQuery дочерних не выполнялись?
2. Или если выполняются то те окна в которых CloseQuery вернул true закрывались, даже если следующий обработчик вернул false?
Armorer вне форума Ответить с цитированием
Старый 09.08.2011, 13:11   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ввести глобальную пнрнменную. Нач.знач = False. Перед закрытием гл.формы поместить True. Везде в CloseQuery анализировать значение этой переменной
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.08.2011, 13:32   #3
Armorer
Подтвердите свой е-майл
 
Регистрация: 07.04.2007
Сообщений: 120
По умолчанию

"Перед закрытием гл.формы поместить True." как отследить закрытие главной формы, прежде чем сработают onCloseQuery дочерних?
Armorer вне форума Ответить с цитированием
Старый 09.08.2011, 13:33   #4
Armorer
Подтвердите свой е-майл
 
Регистрация: 07.04.2007
Сообщений: 120
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ввести глобальную пнрнменную. Нач.знач = False. Перед закрытием гл.формы поместить True. Везде в CloseQuery анализировать значение этой переменной
как отследить закрытие главной формы, прежде чем сработают onCloseQuery дочерних?
Armorer вне форума Ответить с цитированием
Старый 09.08.2011, 13:58   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

OnCloseQuery главной формы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.08.2011 в 14:03.
Аватар вне форума Ответить с цитированием
Старый 09.08.2011, 14:07   #6
Armorer
Подтвердите свой е-майл
 
Регистрация: 07.04.2007
Сообщений: 120
По умолчанию

Цитата:
OnCloseQuery главной формы
OnCloseQuery главной формы вызывается после OnCloseQuery дочерних.

из Forms:
Код:
function TCustomForm.CloseQuery: Boolean;
var
  I: Integer;
begin
  if FormStyle = fsMDIForm then
  begin
    Result := False;
    for I := 0 to MDIChildCount - 1 do
      if not MDIChildren[I].CloseQuery then Exit;
  end;
  Result := True;
  if Assigned(FOnCloseQuery) then FOnCloseQuery(Self, Result);
 end;
Armorer вне форума Ответить с цитированием
Старый 09.08.2011, 14:13   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> OnCloseQuery главной формы вызывается после OnCloseQuery дочерних.

и это логично ) А что там с WM_CLOSE?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.08.2011, 14:32   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Протупил. Тогда как veniside подсказал - попробовать переопределить обработчик WM_CLOSE
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.08.2011, 14:39   #9
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

В конце-концов если не нравится вариант с глобальной переменной (так и не понял почему), можно сделать так

Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i: integer;
begin
  for i := 0 to Form1.MDIChildCount - 1 do
  begin
    Form1.MDIChildren[i].OnCloseQuery := nil;
  end;
end;
Баламут вне форума Ответить с цитированием
Старый 09.08.2011, 14:46   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Та же проблема, что и OnCloseQuery главной формы
Код:
procedure TCustomForm.Close;
var
  CloseAction: TCloseAction;
begin
  if fsModal in FFormState then
    ModalResult := mrCancel
  else
    if CloseQuery then
    begin
      if FormStyle = fsMDIChild then
        if biMinimize in BorderIcons then
          CloseAction := caMinimize else
          CloseAction := caNone
      else
        CloseAction := caHide;
      DoClose(CloseAction);
      if CloseAction <> caNone then
        if Application.MainForm = Self then Application.Terminate
        else if CloseAction = caHide then Hide
        else if CloseAction = caMinimize then WindowState := wsMinimized
        else Release;
    end;
end;
Еще вариант
Код:
type
  TForm1 = class(TForm)
  public
    procedure Close;
  end;

implementation

procedure TForm1.Close;
begin
//Здесь присвоить True глобальной переменной
  Inherited;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.08.2011 в 14:54.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие и открытие дочерних MDI окон приложения chandrasecar Общие вопросы Delphi 4 16.05.2011 13:41
Закрытие всех дочерних форм belarusfight C# (си шарп) 3 26.02.2011 15:06
Много дочерних форм... L.A.M.E.R. Общие вопросы Delphi 4 03.08.2010 08:13
Расположение дочерних MDI окон слева-направо и сверху-вниз Umdis Общие вопросы Delphi 2 30.11.2009 07:05
AlphaSkins. Как убрать скин с дочерних MDI Форм? chandrasecar Компоненты Delphi 4 11.02.2009 20:06