Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.11.2010, 22:04
Аватар для nomen-nescio
nomen-nescio nomen-nescio вне форума
Прохожий
 
Регистрация: 26.09.2010
Адрес: Рязань
Сообщения: 20
Репутация: 10
По умолчанию Проблема с выходом из программы

В моей программе есть меню, в котором есть пункт выход, по нажатию на который программа выдает запрос "Сохранить файл?" и кнопки да, нет, отмена. Так вот, эта кнопка привязана также к событию закрытия формы Form Close.
Код:
procedure TfrmGL.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  N6Click(nil);
end;
Когда я завершаю работу с программой нажатием крестика в верхнем левом углу и нажатия в последующем диалоговом окне кнопки "Отмена" программа выходит, вместо того, чтобы вернуться к работе. Причем, если я выбираю пункт "Выход" из меню, то всё работает исправно. Почему так?
Ответить с цитированием
  #2  
Старый 17.11.2010, 23:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

потому что надот делать по другому.
по нажатию кнопки выход надо сделать только close;
А вот в OncloseQuery надо сделать что-то типа:
Код:
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
   CanClose := MessageDlg('Are you sure to close the program?',
                          mtConfirmation,[mbYes,mbNo],0) = mrYes;
end;
Ответить с цитированием
  #3  
Старый 18.11.2010, 00:15
Аватар для nomen-nescio
nomen-nescio nomen-nescio вне форума
Прохожий
 
Регистрация: 26.09.2010
Адрес: Рязань
Сообщения: 20
Репутация: 10
По умолчанию

Работает) Но потом пишет ошибку EStackOverflow with message 'Stack Overflow'.
Код следующий:
Код:
procedure TfrmGL.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
  Res: Integer;
begin
  if not Saved then
  begin
    Res:=Application.MessageBox('Сохранить изменения ?', 'Предупреждение',
           MB_YESNOCANCEL);
    if Res=IDYes then
     begin
      N13Click(nil);
      Saved:=True;
      CanClose:=True;
      Application.Terminate;
     end
    else if Res=IDNo then
     begin
      CanClose:=True;
      Application.Terminate;
     end
    else if Res=IDCancel then
     begin
      CanClose:=False;
      Exit;
     end
  end;
end;

Код:
procedure TfrmGL.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Close;
end;
Ответить с цитированием
  #4  
Старый 18.11.2010, 01:35
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Код:
procedure TfrmGL.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Close;
end;
Так делать нельзя. Close вызывает событие FormClose, которое, в свою очередь, вызывает Close. Получается бесконечная рекурсия.
Также в предыдущем куске лишним является Application.Terminate . Программа итак закрывается, зачем несколько раз ей говорить закрыться?
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #5  
Старый 18.11.2010, 02:11
Аватар для nomen-nescio
nomen-nescio nomen-nescio вне форума
Прохожий
 
Регистрация: 26.09.2010
Адрес: Рязань
Сообщения: 20
Репутация: 10
По умолчанию

Понял. А как надо сделать? Application.Terminate убрал, теперь по нажатию "Отмена" работает. Когда нажимаю "Нет" ничего не происходит и окно опять вылетет диалоговое.
Ответить с цитированием
  #6  
Старый 18.11.2010, 13:32
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Код:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if not Saved then
    case Application.MessageBox('Сохранить изменения ?', 'Предупреждение', MB_YESNOCANCEL) of
      IDYes:
          begin
            {<Сохранить>}
            Saved:=True;
            CanClose:=True;
          end;
      IDNo: CanClose:=True;
      IDCancel: CanClose:=False;
    end;
end;
все работает.
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #7  
Старый 18.11.2010, 19:48
Аватар для nomen-nescio
nomen-nescio nomen-nescio вне форума
Прохожий
 
Регистрация: 26.09.2010
Адрес: Рязань
Сообщения: 20
Репутация: 10
По умолчанию

Спасибо)) Работает) Разобрался)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:53.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025