ViewManager.pas 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. unit ViewManager;
  2. interface
  3. uses
  4. SysUtils, InterfaceUI, Classes, Forms;
  5. type
  6. TViewManager = class(TInterfacedObject, IViewManager)
  7. private
  8. FClasses: TList;
  9. FSingleViews: TStringList;
  10. FOpenViews: TStringList;
  11. public
  12. constructor Create;
  13. destructor Destroy; override;
  14. class function Current: TViewManager;
  15. function GetView(AClassName: string): IUIForm;
  16. function GetSingleView(AClassName: string): IUIForm;
  17. function GetIDView(AClassName, AFormID: string): IUIIDForm;
  18. function FreeIDView(AClassName, AFormID: string): IUIIDForm;
  19. procedure RegisterClass(AClass: TFormClass);
  20. end;
  21. implementation
  22. var
  23. FViewManager: TViewManager;
  24. { TViewManager }
  25. constructor TViewManager.Create;
  26. begin
  27. FClasses := TList.Create;
  28. FSingleViews := TStringList.Create;
  29. FOpenViews := TStringList.Create;
  30. inherited;
  31. end;
  32. class function TViewManager.Current: TViewManager;
  33. begin
  34. if FViewManager = nil then
  35. FViewManager := TViewManager.Create;
  36. Result := FViewManager;
  37. end;
  38. destructor TViewManager.Destroy;
  39. begin
  40. FreeAndNil(FClasses);
  41. FreeAndNil(FOpenViews);
  42. FreeAndNil(FSingleViews);
  43. inherited;
  44. end;
  45. function TViewManager.FreeIDView(AClassName, AFormID: string): IUIIDForm;
  46. var
  47. i: Integer;
  48. begin
  49. i := FOpenViews.IndexOf(AClassName + AFormID);
  50. if i > -1 then
  51. FOpenViews.Delete(i);
  52. end;
  53. function TViewManager.GetIDView(AClassName, AFormID: string): IUIIDForm;
  54. var
  55. i: Integer;
  56. AClass: TFormClass;
  57. AForm: TForm;
  58. ColorForm: IChangeUIColor;
  59. begin
  60. i := FOpenViews.IndexOf(AClassName + AFormID);
  61. if i < 0 then
  62. begin
  63. for i := 0 to FClasses.Count - 1 do
  64. begin
  65. if TFormClass(FClasses[i]).ClassName = AClassName then
  66. begin
  67. AClass := TFormClass(FClasses[i]);
  68. AForm := AClass.Create(Application);
  69. if not AForm.GetInterface(IUIIDForm, Result) then
  70. begin
  71. Result := nil;
  72. Exit;
  73. end;
  74. Result.SetAutoFree(True);
  75. Result.SetFormID(AFormID);
  76. // if AForm.GetInterface(IChangeUIColor, ColorForm) then
  77. // ColorForm.ChangeUIColor(MainForm.FormColor);
  78. FOpenViews.AddObject(AClassName, AForm);
  79. Break;
  80. end;
  81. end;
  82. end
  83. else
  84. FOpenViews.Objects[i].GetInterface(IUIIDForm, Result);
  85. end;
  86. function TViewManager.GetSingleView(AClassName: string): IUIForm;
  87. var
  88. i: Integer;
  89. AClass: TFormClass;
  90. AForm: TForm;
  91. ColorForm: IChangeUIColor;
  92. begin
  93. i := FSingleViews.IndexOf(AClassName);
  94. if i < 0 then
  95. begin
  96. for i := 0 to FClasses.Count - 1 do
  97. begin
  98. if TCustomFormClass(FClasses[i]).ClassName = AClassName then
  99. begin
  100. AClass := TFormClass(FClasses[i]);
  101. AForm := AClass.Create(Application);
  102. if not AForm.GetInterface(IUIForm, Result) then
  103. begin
  104. Result := nil;
  105. Exit;
  106. end;
  107. Result.SetAutoFree(False);
  108. // if AForm.GetInterface(IChangeUIColor, ColorForm) then
  109. // ColorForm.ChangeUIColor(MainForm.FormColor);
  110. FSingleViews.AddObject(AClassName, AForm);
  111. Break;
  112. end;
  113. end;
  114. end
  115. else
  116. FSingleViews.Objects[i].GetInterface(IUIForm, Result);
  117. end;
  118. function TViewManager.GetView(AClassName: string): IUIForm;
  119. var
  120. i: Integer;
  121. AClass: TFormClass;
  122. AForm: TForm;
  123. // ColorForm: IChangeUIColor;
  124. begin
  125. for i := 0 to FClasses.Count - 1 do
  126. begin
  127. if TCustomFormClass(FClasses[i]).ClassName = AClassName then
  128. begin
  129. AClass := TFormClass(FClasses[i]);
  130. AForm := AClass.Create(Application);
  131. // if AForm.GetInterface(IChangeUIColor, ColorForm) then
  132. // ColorForm.ChangeUIColor(MainForm.FormColor);
  133. if not AForm.GetInterface(IUIForm, Result) then
  134. begin
  135. Result := nil;
  136. AForm.Free;
  137. end;
  138. // else
  139. // begin
  140. // Result.SetAutoFree(True);
  141. // FOpenViews.AddObject(IntToStr(AForm.Handle), AForm);
  142. // end;
  143. // Break;
  144. end;
  145. end;
  146. end;
  147. procedure TViewManager.RegisterClass(AClass: TFormClass);
  148. var
  149. i: Integer;
  150. begin
  151. i := FClasses.IndexOf(AClass);
  152. if i < 0 then
  153. FClasses.Add(AClass);
  154. end;
  155. initialization
  156. finalization
  157. // if FViewManager <> nil then
  158. // FreeAndNil(FViewManager);
  159. end.