Справочник по компонентам Delphi. Часть 3 - Закрытие формы

ОГЛАВЛЕНИЕ

Закрытие формы 

Для закрытия формы необходимо, чтобы он вернул True. Этот метод — прямой аналог метода CanClose в библиотеке OWL. Для проверки на воз­можность закрытия он вызывает обработчик события:

 (Pb) property OnCloseQuery: TCloseQueryEvent; 
TCloseQueryEvent = procedure(Sender: TObject; var CanClose: Boolean) of object;

Здесь вы должны проверить возможность закрытия формы и вернуть нужное значение в параметре CanClose (который изначально имеет значение True). Например:

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin
    if Memo1.Modified then
        case MessageDlg('Save text?', mtWarning, mbYesNoCancel, 0) of
            mrYes: Memol.Lines.SaveToFile('MYTEXT.TXT ');
            mrCancel: CanClose := False;
        end;
end;

Таким образом, если обработчик события OnCloseQuery не описан, возвраща­ется True (форму можно закрыть).

Для форм стиля fsMDIForm (родительских окон MDI) сначала должны за­крываться все дочерние формы (вызываются их методы CloseQuery). Если хотя бы одна из них возвращает False, метод тут же возвращает False, и обработчик события OnCloseQuery закрываемой родительской формы управления не полу­чает.

Затем метод Close вызывает обработчик следующего события

(Pb) property OnClose: TCloseEvent;
TCloseEvent = procedure(Sender: TObject; var Action : TCloseAction) of object;
TCloseAction = (caNone, caHide, caFree, caMinimize);

что позволяет определить дальнейшую реакцию. Дело в том, что закрытие можно реализовать различными способами, в зависимости от значения пара­метра Action:

  • caNone — не делать ничего;
  • caHide — сделать форму невидимой (скрыть);
  • caMinimize — свернуть форму в значок;
  • caFree — уничтожить форму, вызвав ее деструктор.

Перед вызовом OnClose в параметр Action засылается значение caHide. Ис­ключение составляют дочерние формы MDI, для которых засылается значение caMinimize или caNone в зависимости от возможности их сворачивания.

Если обработчик вернул значение caNone, форма не закрывается. Таким путем можно продублировать OnCloseQuery.

При закрытии главной формы приложения любое отличное от caNone значение вызывает завершение приложения. Для формы, не являющейся главной, зна­чения caHide и caMinimize позволяют соответственно скрыть и свернуть ее в значок. Выбор значения caFree влечет за собой вызов деструктора путем обращения к методу:

 procedure Release; 

Последним при уничтожении формы инициализируется событие:

 (Pb) property OnDestroy: TNotifyEvent; 

Это событие является парным по отношению к OnCreate; обработчик его вызывается в деструкторе формы. Здесь программист может предумотреть необходимые действия при уничтожении формы, к примеру, записать значения в файл JNI.