Main.pas 7.9 KB

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