Understanding the Birth, Life and Death of a Delphi Form

Life-Cycle of a Delphi Form

One Finger Typing
Chris Pecoraro/E+/Getty Images

In Windows, most elements of the user interface are windows. In Delphi, every project has at least one window - program's main window. All windows of a Delphi application are based on TForm object.


Form objects are the basic building blocks of a Delphi application, the actual windows with which a user interacts when they run the application. Forms have their own properties, events, and methods with which you can control their appearance and behavior.
A form is actually a Delphi component, but unlike other components, a form doesn't appear on the component palette.

We normally create a form object by starting a new application (File | New Application). This newly created form will be, by default, the application's main form - the first form created at runtime.

Note: To add an additional form to Delphi project, we select File|New Form. There are, of course, other ways to add a "new" form to a Delphi project.


The OnCreate event is fired when a TForm is first created, that is, only once. The statement responsible for creating the form is in the project's source (if the form is set to be automatically created by the project). When a form is being created and its Visible property is True, the following events occur in the order listed: OnCreate, OnShow, OnActivate, OnPaint.

You should use the OnCreate event handler to do, for example, initialization chores like allocating string lists.

Any objects created in the OnCreate event should be freed by the OnDestroy event.

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

This event indicates that the form is being displayed. OnShow is called just before a form becomes visible. Besides main forms, this event happens when we set forms Visible property to True, or call the Show or ShowModal method.

This event is called when the program activates the form - that is, when the form receives the input focus. Use this event to change which control actually gets focus if it is not the one desired.

OnPaint, OnResize
Events like OnPaint and OnResize are always called after the form is initially created, but are also called repeatedly. OnPaint occurs before any controls on the form are painted (use it for special painting on the form).


As we have seen the birth of a form is not so interesting as the life and death can be. When your form is created and all the controls are waiting for events to handle, the program is running until someone tries to close the form!


An event-driven application stops running when all its forms are closed and no code is executing. If a hidden form still exists when the last visible form is closed, your application will appear to have ended (because no forms are visible), but will in fact continue to run until all the hidden forms are closed. Just think of a situation where the main form gets hidden early and all other forms are closed.
 ... OnCloseQuery -> OnClose -> OnDeactivate -> OnHide -> OnDestroy 

When we try to close the form using the Close method or by other means (Alt+F4), the OnCloseQuery event is called.

Thus, event handler for this event is the place to intercept a form's closing and prevent it. We use the OnCloseQuery to ask the users if they are sure that they realy want the form to close.

 procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean) ;
   if MessageDlg('Really close this window?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then CanClose := False;
An OnCloseQuery event handler contains a CanClose variable that determines whether a form is allowed to close. The OnCloseQuery event handler may set the value of CloseQuery to False (via the CanClose parameter), thus aborting the Close method.

If OnCloseQuery indicates that the form should be closed, the OnClose event is called.

The OnClose event gives us one last chance to prevent the form from closing.

The OnClose event handler has an Action parameter, with the following four possible values:

  • caNone. The form is not allowed to close. Just as if we have set the CanClose to False in the OnCloseQuery.
  • caHide. Instead of closing the form you hide it.
  • caFree. The form is closed, so it's allocated memory is freed by Delphi.
  • caMinimize. The form is minimized, rather than closed. This is the default action for MDI child forms. Note: When a user shuts down Windows, the OnCloseQuery event is activated, not the OnClose. If you want to prevent Windows from shuting down, put your code in the OnCloseQuery event handler, of course CanClose=False will not do the trick.

After the OnClose method has been processed and the form is to be closed, the OnDestroy event is called. Use this event for operations opposite to those in the OnCreate event. OnDestroy is therefore used to deallocate objects related to the form and free the corresponding memory.

Of course, when the main form for a project closes, the application terminates.