Dim the main application form when a dialog box is displayed #228

Dialog windows that you use to display critical information to the user are, in most cases, displayed modally. A modal form is one where the application can't continue to run until the modal form is closed. Delphi's ShowMessage, InputBox and MessageDlg routines, for example, display a modal form and wait for the user to take some action. Your custom dialogs are displayed modally using the ShowModal method of a form.

To emphasize the importance of a modal form and the information it presents, you could gray out the main form of the application when the modal form is activated. Here's how to add a "dim-out" effect to your main form when modal forms are waiting for the user input.

  • Create a new application with a main form and name it MainForm.
  • Add a new form to the project and name it DimmerForm. This will be the "dimmer" form. Ensure this form is created on application startup.
  • Drop a TApplicationEvents component on the main form. Create handlers for its OnModalBegin and OnModalEnd events.

Since TDimmerForm is created at application startup - and since it is not the main form, it will not be displayed initially. Its Display procedure aligns the dimmer form above the main form and gets displayed just before any modal form is shown. This happens in the TApplicationEvent's OnModalBegin event. OnModalEnd ensures that dimmer form is hidden when a modal form is closed. It remains hidden until needed next time.

procedure TDimmerForm.FormCreate(Sender: TObject) ;
  AlphaBlend := true;
  AlphaBlendValue := 128;
  BorderStyle := bsNone;

The above is the OnCreate event handler for the dimmer form. By using the AlphaBlend and AlphaBlendValue properties you can make the form translucent. As it will be displayed over the main form, we want it to create the dim-out effect. BorderStyle ensures this form has no border, no caption bar, no title buttons. The Display procedure aligns the dimmer form above the main form:

procedure TDimmerForm.Display;
  with Self do
    Left := MainForm.Left;
    Top := MainForm.Top;
    Width := MainForm.Width;
    Height := MainForm.Height;

Finally, handle the OnModalBegin and OnModalEnd events of the TApplicationEvents component on the main form:

//TApplicationEvents OnModalBegin
procedure TMainForm.ApplicationEvents1ModalBegin(Sender: TObject) ;
//TApplicationEvents OnModalEnd
procedure TMainForm.ApplicationEvents1ModalEnd(Sender: TObject) ;

That's it!

In MDI (multiple document interface) Delphi applications, more than one form can be opened within a single parent window - i.e. the main form. MDI applications are ideal candidates for the dimmer form :)

Original resource:
Author: Unknown
Contributor: topellina
Added: 2013/09/06
Last updated: 2013/09/06