Main.pas 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. unit Main;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. Winapi.Messages,
  6. System.SysUtils,
  7. System.Variants,
  8. System.Classes,
  9. Vcl.Graphics,
  10. Vcl.Controls,
  11. Vcl.Forms,
  12. Vcl.Dialogs,
  13. Vcl.StdCtrls,
  14. Quick.Config,
  15. Quick.Config.Provider.Registry,
  16. System.Generics.Collections,
  17. Quick.Config.Provider.Json;
  18. type
  19. TMyPriority = (msLow, msMed, msHigh);
  20. TWinPos = record
  21. public
  22. PosX : Integer;
  23. PosY : Integer;
  24. end;
  25. TProcessType = record
  26. Id : Integer;
  27. Priority : TMyPriority;
  28. Redundant : Boolean;
  29. end;
  30. TWorker = class
  31. Name : string;
  32. Active : Boolean;
  33. end;
  34. TMyConfig = class(TAppConfig)
  35. private
  36. fTitle : string;
  37. fHidden : Boolean;
  38. fSessionName: string;
  39. public
  40. Sizes : array of Integer;
  41. LastFilename : string;
  42. WindowPos : TWinPos;
  43. History : array of TProcessType;
  44. Complex : TProcessType;
  45. ModifyDate : TDateTime;
  46. WorkList : TObjectList<TWorker>;
  47. constructor Create; override;
  48. destructor Destroy; override;
  49. procedure DefaultValues;
  50. property Title : string read fTitle write fTitle;
  51. property SessionName : string read fSessionName write fSessionName;
  52. end;
  53. TMainForm = class(TForm)
  54. meInfo: TMemo;
  55. btnLoadJson: TButton;
  56. btnSaveJson: TButton;
  57. btnLoadRegistry: TButton;
  58. SaveRegistry: TButton;
  59. procedure FormCreate(Sender: TObject);
  60. procedure btnLoadJsonClick(Sender: TObject);
  61. procedure btnSaveJsonClick(Sender: TObject);
  62. procedure SaveRegistryClick(Sender: TObject);
  63. procedure btnLoadRegistryClick(Sender: TObject);
  64. procedure SetConfig(cConfig: TMyConfig);
  65. function TestConfig(cConfig1, cConfig2: TMyConfig) : Boolean;
  66. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  67. end;
  68. var
  69. MainForm: TMainForm;
  70. ConfigJson : TMyConfig;
  71. ConfigReg : TMyConfig;
  72. ConfigTest : TMyConfig;
  73. AppConfigJson : TAppConfigJsonProvider<TMyConfig>;
  74. AppConfigReg : TAppConfigRegistryProvider<TMyConfig>;
  75. implementation
  76. {$R *.dfm}
  77. procedure TMainForm.btnLoadJsonClick(Sender: TObject);
  78. begin
  79. meInfo.Lines.Add('Load ConfigJson');
  80. AppConfigJson.Load(ConfigJson);
  81. meInfo.Lines.Add(ConfigJson.ToJSON);
  82. if TestConfig(ConfigTest,ConfigJson) then meInfo.Lines.Add('Test passed successfully!');
  83. end;
  84. procedure TMainForm.btnLoadRegistryClick(Sender: TObject);
  85. begin
  86. meInfo.Lines.Add('Load ConfigReg');
  87. AppConfigReg.Load(ConfigReg);
  88. meInfo.Lines.Add(ConfigReg.ToJSON);
  89. if TestConfig(ConfigTest,ConfigReg) then meInfo.Lines.Add('Test passed successfully!');
  90. end;
  91. procedure TMainForm.btnSaveJsonClick(Sender: TObject);
  92. begin
  93. SetConfig(ConfigJson);
  94. AppConfigJson.Save(ConfigJson);
  95. meInfo.Lines.Add('Saved Config in Json at ' + DateTimeToStr(ConfigJson.LastSaved));
  96. end;
  97. procedure TMainForm.SaveRegistryClick(Sender: TObject);
  98. begin
  99. SetConfig(ConfigReg);
  100. AppConfigReg.Save(ConfigReg);
  101. meInfo.Lines.Add('Saved Config in Registry at ' + DateTimeToStr(ConfigReg.LastSaved));
  102. end;
  103. procedure TMainForm.SetConfig(cConfig : TMyConfig);
  104. var
  105. protype : TProcessType;
  106. i : Integer;
  107. worker : TWorker;
  108. begin
  109. cConfig.LastFilename := 'library.txt';
  110. cConfig.Sizes := [23,11,554,12,34,29,77,30,48,59,773,221,98,3,22,983,122,231,433,12,31,987];
  111. cConfig.WindowPos.PosX := 640;
  112. cConfig.WindowPos.PosX := 480;
  113. cConfig.Complex.Priority := msHigh;
  114. cConfig.Complex.Redundant := False;
  115. cConfig.Title := 'a fresh title';
  116. cConfig.SessionName := 'First Session';
  117. for I := 0 to 22 do
  118. begin
  119. worker := TWorker.Create;
  120. worker.Name := 'Process ' + i.ToString;
  121. worker.Active := Boolean(Random(1));
  122. cConfig.WorkList.Add(worker);
  123. end;
  124. for i := 0 to 15 do
  125. begin
  126. protype.Id := i;
  127. protype.Priority := msLow;
  128. protype.Redundant := True;
  129. cConfig.History := cConfig.History + [protype];
  130. end;
  131. cConfig.ModifyDate := Now();
  132. end;
  133. function TMainForm.TestConfig(cConfig1, cConfig2 : TMyConfig) : Boolean;
  134. var
  135. i : Integer;
  136. begin
  137. try
  138. Assert(cConfig1.LastFilename = cConfig2.LastFilename);
  139. for i := Low(cConfig1.Sizes) to High(cConfig1.Sizes) do
  140. Assert(cConfig1.Sizes[i] = cConfig2.Sizes[i]);
  141. Assert(cConfig1.WindowPos.PosX = cConfig2.WindowPos.PosX);
  142. Assert(cConfig1.WindowPos.PosX = cConfig2.WindowPos.PosX);
  143. Assert(cConfig1.Complex.Priority = cConfig2.Complex.Priority);
  144. Assert(cConfig1.Complex.Redundant = cConfig2.Complex.Redundant);
  145. Assert(cConfig1.Title = cConfig2.Title);
  146. for i := 0 to cConfig1.WorkList.Count - 1 do
  147. begin
  148. Assert(cConfig1.WorkList[i].Name = cConfig2.WorkList[i].Name);
  149. Assert(cConfig1.WorkList[i].Active = cConfig2.WorkList[i].Active);
  150. end;
  151. for i := 0 to High(cConfig1.History) do
  152. begin
  153. Assert(cConfig1.History[i].Priority = cConfig2.History[i].Priority);
  154. Assert(cConfig1.History[i].Redundant = cConfig2.History[i].Redundant);
  155. end;
  156. Result := True;
  157. except
  158. ShowMessage('Configuration not has been saved previously or has a corruption problem');
  159. end;
  160. end;
  161. procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
  162. begin
  163. if Assigned(AppConfigJson) then AppConfigJson.Free;
  164. if Assigned(AppConfigReg) then AppConfigReg.Free;
  165. if Assigned(ConfigTest) then ConfigTest.Free;
  166. if Assigned(ConfigReg) then ConfigReg.Free;
  167. if Assigned(ConfigJson) then ConfigJson.Free;
  168. end;
  169. procedure TMainForm.FormCreate(Sender: TObject);
  170. begin
  171. ConfigTest := TMyConfig.Create;
  172. SetConfig(ConfigTest);
  173. AppConfigJson := TAppConfigJsonProvider<TMyConfig>.Create(ConfigJson);
  174. AppConfigJson.CreateIfNotExists := True;
  175. AppConfigJson.Filename := 'Config.json';
  176. AppConfigReg := TAppConfigRegistryProvider<TMyConfig>.Create(ConfigReg);
  177. AppConfigReg.HRoot := HKEY_CURRENT_USER;
  178. AppConfigReg.MainKey := '_AppConfig';
  179. end;
  180. { TMyConfig }
  181. constructor TMyConfig.Create;
  182. begin
  183. inherited;
  184. WorkList := TObjectList<TWorker>.Create(True);
  185. DefaultValues;
  186. end;
  187. procedure TMyConfig.DefaultValues;
  188. begin
  189. fTitle := 'Default value';
  190. end;
  191. destructor TMyConfig.Destroy;
  192. begin
  193. if Assigned(WorkList) then WorkList.Free;
  194. inherited;
  195. end;
  196. end.