--- ---

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) ;
    begin
      AlphaBlend := true;
      AlphaBlendValue := 128;
      BorderStyle := bsNone;
    end;

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;
    begin
      with Self do
      begin
        Left := MainForm.Left;
        Top := MainForm.Top;
        Width := MainForm.Width;
        Height := MainForm.Height;
        Show;
      end;
    end;

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

    //TApplicationEvents OnModalBegin
    procedure TMainForm.ApplicationEvents1ModalBegin(Sender: TObject) ;
    begin
      DimmerForm.Display;
    end;

    //TApplicationEvents OnModalEnd
    procedure TMainForm.ApplicationEvents1ModalEnd(Sender: TObject) ;
    begin
      DimmerForm.Hide;
    end;

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 :)