Main.pas 6.5 KB

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