Delphi world - народження, життя і загибель форми

Народження, життя і загибель форми

(Переклад однойменної статті з сайту delphi.about.com)

У Windows основний елемент призначеного для користувача інтерфейсу - форма. У Delphi кожен проект має принаймні одне вікно - головне вікно програми. Всі вікна в Delphi засновані на об'єкті TForm. У даній статті ми розглянемо основні події учавствующие в "життя форми".

Форми мають свої властивості, події і методи, за допомогою яких Ви можете управляти виглядом та поведінкою форми. Форма, це звичайний компонент Delphi, але на відміну від інших, її немає на панелі компонентів. Зазвичай форма створюється при створенні нового проекту (File | New Application). Новостворена форма буде головною формою додатка.

Додаткові форми в проекті створюються через File | New Form. Так само існують і інші способи створення форм, але тут ми не будемо розглядати їх.

Як і будь-який інший компонент (об'єкт) форма має свої методи і реагує на події. Давайте розглянемо деякі з цих подій.

OnCreate -> OnShow -> OnActivate -> OnPaint -> OnResize -> OnPaint.

Подія OnCreate виникає при створенні TForm і тільки один раз. При створенні форми (у каторой властивість Visible встановлено в True), події відбудуться в наступному порядку: OnCreate, OnShow, OnActivate, OnPaint. У обробнику події OnCreate можна зробити будь-які ініціалізацій дії, однак, будь-які об'єкти створені в OnCreate будуть знищені в подію OnDestroy.

Ця подія генерується, коли форма стане видимою. OnShow викликається відразу перед тим, як форма стане видимою. Ця подія трапляється, якщо встановити властивість форми Visible в True, або при виклику методів Show або ShowModal.

Ця подія генерується, коли форма стає активною, тобто коли форма отримує фокус введення. Цю подію можна використовувати для того, щоб змінити елемент форми який повинен отримати фокус.

OnPaint, OnResize Ці події викликаються кожен раз, коли форма спочатку створюється. При цьому OnPaint викликається кожен раз, коли якомусь елементу форми необхідно перемалювати (цю подію можна використовувати, якщо необхідно при цьому малювати на формі щось особливе).

Коли форма створена і все її елементи чекають своїх подій, щоб обробляти їх, життя форми триває до тих пір, поки хто-небудь не натисне хрестик в правому верхньому куті форми!

При знищенні форми, події генеруються в наступному порядку:

OnCloseQuery -> OnClose -> OnDeactivate -> OnHide -> OnDestroy

Якщо ми спробуємо закрити форму за допомогою методу Close або іншим доступним способом (Alt + F4 або через системне меню), то згенерує подія OnCloseQuery. Таким чином, цю подію можна використовувати, щоб запобігти закриттю форми. Зазвичай, подія OnCloseQuery використовується для того, щоб запитати користувача - упевнений він (можливо в додатку залишилися незбережені дані).

Обробник події OnCloseQuery містить змінну CanClose, яка визначає, чи можна формі закритися. Початкове значення цієї змінної True. Однак в обробнику OnCloseQuery можна встановити значення, що повертається CloseQuery в False, щоб перервати виконання методу Close.

Якщо OnCloseQuery повернув CanClose = True (що вказує на те, що форма повинна бути закрита), то буде буде згенеровано подія OnClose. Подія OnClose дає останній шанс, щоб запобігти закриттю форми. Оброблювач OnClose має параметр Action з наступними чотирма можливими значеннями: caNone. Формі не дозволено закритися. Все одно, що ми встановимо CanClose в False в OnCloseQuery. caHide. Замість закриття, форма буде прихована. caFree. Форма буде закрита, і зайняті їй ресурси будуть звільнені. caMinimize. Замість закриття, форма буде мінімізована. Це значення встановлюється за замовчуванням у дочірніх форм MDI.

Зауваження: Коли користувач шутдауніт Windows, то буде викликано OnCloseQuery, а не OnClose. Якщо Ви не хочете, щоб Windows завершила свою роботу, то помістіть свій код в обробник події OnCloseQuery, хоча CanClose = False не зробить, того, що зроблено тут.

Після того, як метод OnClose буде оброблений і форма буде закрита, то буде викликано подія OnDestroy. У OnCreate зазвичай робляться дії, протилежні тим, які пророблялися в OnCreate, тобто знищення створених об'єктів і звільнення виділеної пам'яті.

Естевственно, що коли головна форма проекту буде закрито, то додаток буде завершено.