unit ViewManager; interface uses SysUtils, InterfaceUI, Classes, Forms; type TViewManager = class(TInterfacedObject, IViewManager) private FClasses: TList; FSingleViews: TStringList; FOpenViews: TStringList; public constructor Create; destructor Destroy; override; class function Current: TViewManager; function GetView(AClassName: string): IUIForm; function GetSingleView(AClassName: string): IUIForm; function GetIDView(AClassName, AFormID: string): IUIIDForm; function FreeIDView(AClassName, AFormID: string): IUIIDForm; procedure RegisterClass(AClass: TFormClass); end; implementation var FViewManager: TViewManager; { TViewManager } constructor TViewManager.Create; begin FClasses := TList.Create; FSingleViews := TStringList.Create; FOpenViews := TStringList.Create; inherited; end; class function TViewManager.Current: TViewManager; begin if FViewManager = nil then FViewManager := TViewManager.Create; Result := FViewManager; end; destructor TViewManager.Destroy; begin FreeAndNil(FClasses); FreeAndNil(FOpenViews); FreeAndNil(FSingleViews); inherited; end; function TViewManager.FreeIDView(AClassName, AFormID: string): IUIIDForm; var i: Integer; begin i := FOpenViews.IndexOf(AClassName + AFormID); if i > -1 then FOpenViews.Delete(i); end; function TViewManager.GetIDView(AClassName, AFormID: string): IUIIDForm; var i: Integer; AClass: TFormClass; AForm: TForm; ColorForm: IChangeUIColor; begin i := FOpenViews.IndexOf(AClassName + AFormID); if i < 0 then begin for i := 0 to FClasses.Count - 1 do begin if TFormClass(FClasses[i]).ClassName = AClassName then begin AClass := TFormClass(FClasses[i]); AForm := AClass.Create(Application); if not AForm.GetInterface(IUIIDForm, Result) then begin Result := nil; Exit; end; Result.SetAutoFree(True); Result.SetFormID(AFormID); // if AForm.GetInterface(IChangeUIColor, ColorForm) then // ColorForm.ChangeUIColor(MainForm.FormColor); FOpenViews.AddObject(AClassName, AForm); Break; end; end; end else FOpenViews.Objects[i].GetInterface(IUIIDForm, Result); end; function TViewManager.GetSingleView(AClassName: string): IUIForm; var i: Integer; AClass: TFormClass; AForm: TForm; ColorForm: IChangeUIColor; begin i := FSingleViews.IndexOf(AClassName); if i < 0 then begin for i := 0 to FClasses.Count - 1 do begin if TCustomFormClass(FClasses[i]).ClassName = AClassName then begin AClass := TFormClass(FClasses[i]); AForm := AClass.Create(Application); if not AForm.GetInterface(IUIForm, Result) then begin Result := nil; Exit; end; Result.SetAutoFree(False); // if AForm.GetInterface(IChangeUIColor, ColorForm) then // ColorForm.ChangeUIColor(MainForm.FormColor); FSingleViews.AddObject(AClassName, AForm); Break; end; end; end else FSingleViews.Objects[i].GetInterface(IUIForm, Result); end; function TViewManager.GetView(AClassName: string): IUIForm; var i: Integer; AClass: TFormClass; AForm: TForm; // ColorForm: IChangeUIColor; begin for i := 0 to FClasses.Count - 1 do begin if TCustomFormClass(FClasses[i]).ClassName = AClassName then begin AClass := TFormClass(FClasses[i]); AForm := AClass.Create(Application); // if AForm.GetInterface(IChangeUIColor, ColorForm) then // ColorForm.ChangeUIColor(MainForm.FormColor); if not AForm.GetInterface(IUIForm, Result) then begin Result := nil; AForm.Free; end; // else // begin // Result.SetAutoFree(True); // FOpenViews.AddObject(IntToStr(AForm.Handle), AForm); // end; // Break; end; end; end; procedure TViewManager.RegisterClass(AClass: TFormClass); var i: Integer; begin i := FClasses.IndexOf(AClass); if i < 0 then FClasses.Add(AClass); end; initialization finalization // if FViewManager <> nil then // FreeAndNil(FViewManager); end.