Mega Code Archive

 
Categories / Delphi / Forms
 

Managing MDI forms

Title: Managing MDI forms Question: Manage MDI forms. Each form will be visble only once. Form will be created if needed. Answer: { This article describes a base class for your mainform. (You can inherite from this form or use it as is) Three new routines are presented. They will enable you to easily manage MDI forms: - Only one instance per MDI Class will be activated - Creation of MDI class will be handled by routines if needed - Activated MDI class will be focused if needed } ////////////////////////////////////////////////////////////////// type TMDIClass = class of TForm; type TBaseMainForm = class(TForm) ... public { Public declarations } function ActivateMDIClass(MDIClass : TMDIClass) : TForm; function GetMDIClassIndex(MDIClass : TMDIClass) : Integer; function MDIClassIsActive(MDIClass : TMDIClass) : Boolean; ... end; implementation { Use ActivateMDIClass() to activate a mdi child class. If the class is not created yet, it will be. The mdi child will be shown on screen and focused. } function TBaseMainForm.ActivateMDIClass(MDIClass: TMDIClass): TForm; var i : Integer; begin // Try to find index of MDIClass form in MDI child list i := GetMDIClassIndex(MDIClass); // if index is not found (-1) then create the form if i=-1 then Result := MDIClass.Create(Application) else Result := MDIChildren[i]; // bring it to front Result.Show; Result.BringToFront; end; { Get mdi child index of specified MDIClass. Returns -1 if the MDIClass does not exist as a created MDI form } function TBaseMainForm.GetMDIClassIndex( MDIClass: TMDIClass): Integer; var i : Integer; begin // Default index -1 = MDIClass not found Result:=-1; // try to find a MDI child of correct MDIClass class for i:=0 to MDIChildCount-1 do if MDIChildren[i].ClassType=MDIClass then Result:=i; end; { Returns true is the MDIClass exists as a created MDI form } function TBaseMainForm.MDIClassIsActive( MDIClass: TMDIClass): Boolean; begin Result := GetMDIClassIndex(MDIClass) -1; end; ////////////////////////////////////////////////////////////////// Usage Example ------------- Create a mainform, inherited from TBaseMainForm. Create two mdi forms called TfrmBrainstorm and TfrmReport. Make sure ...FormStyle=fsMDIChild. Make sure MDI childs can be closed: procedure ...FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; Now use the following code to activate those mdi forms: procedure TMainForm.OnClick1(Sender: TObject); begin ActivateMDIClass(TfrmBrainstorm); end; procedure TMainForm.OnClick2(Sender: TObject); begin ActivateMDIClass(TfrmReport); end;