Main.pas 6.6 KB

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