fMain.pas 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. unit fMain;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Buttons,
  5. Dialogs, StdCtrls, ExtCtrls, CnSMRBplUtils;
  6. type
  7. TfrmMain = class(TForm)
  8. dlgOpen: TOpenDialog;
  9. gpAnalyse: TPanel;
  10. Panel2: TPanel;
  11. pnlRequiredPackages: TPanel;
  12. Label2: TLabel;
  13. mmoRequirePackages: TMemo;
  14. pnlExeFiles: TPanel;
  15. Label3: TLabel;
  16. lstFiles: TListBox;
  17. pnlButton: TPanel;
  18. btnOpenFiles: TBitBtn;
  19. btnAnalyse: TBitBtn;
  20. btnClearFiles: TBitBtn;
  21. btnCopyUnits: TBitBtn;
  22. Label1: TLabel;
  23. mmoUnits: TMemo;
  24. lblPath: TLabel;
  25. edtTOPath: TEdit;
  26. lblCopyTo: TLabel;
  27. edtDEPath: TEdit;
  28. mmoDevUnits: TMemo;
  29. mmoLog: TMemo;
  30. procedure btnCopyUnitsClick(Sender: TObject);
  31. procedure btnClearFilesClick(Sender: TObject);
  32. procedure lstFilesKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  33. procedure lstFilesClick(Sender: TObject);
  34. procedure btnAnalyseClick(Sender: TObject);
  35. procedure FormDestroy(Sender: TObject);
  36. procedure FormCreate(Sender: TObject);
  37. procedure btnOpenFilesClick(Sender: TObject);
  38. procedure FormShow(Sender: TObject);
  39. private
  40. { Private declarations }
  41. FAnalyseResults: TPackageInfosList;
  42. FUIUpdating: Boolean;
  43. FPerformUIUpdating: Boolean;
  44. FAnalysing: Boolean;
  45. function GetSelectedFile: string;
  46. function IndexOfAnalyseResult(const s: string): Integer;
  47. procedure AddFiles(ss: TStrings);
  48. procedure AnalyseAFile(const FileName: string; AllowException: Boolean = False);
  49. procedure AnalyseAllFiles(var Errors: string);
  50. procedure Analysing(b: Boolean);
  51. procedure UpdateAnalyseResultView(PPI: PPackageInfos); overload;
  52. procedure UpdateAnalyseResultView(ssUnits, ssRequirePackages: TStrings); overload;
  53. procedure UpdateAnalyseResultView; overload;
  54. procedure UpdateControlsState;
  55. public
  56. { Public declarations }
  57. end;
  58. var
  59. frmMain: TfrmMain;
  60. implementation
  61. uses StrUtils, CnBaseUtils;
  62. {$R *.dfm}
  63. const
  64. CRLF = #13#10;
  65. var
  66. // ÐèÒª±¾µØ»¯µÄ×Ö·û´®
  67. SCnAnalyzedResultsSaved: string = 'Analyzed Results Saved Successed to File %s.';
  68. SCnDuplicatedNameFound: string = 'Can NOT Save analyzed result: Duplicated File Names Found:'#13#10#13#10'%s';
  69. SCnSomeAnalyzedFailed: string = 'All Files Analyzed, but Some Files Analyzed Failed:'#13#10;
  70. function StringProcessProc(const s: string): string;
  71. begin
  72. Result := ExtractFileName(s);
  73. end;
  74. procedure TfrmMain.AddFiles(ss: TStrings);
  75. var
  76. i: Integer;
  77. tmpSs: TStringList;
  78. begin
  79. tmpSs := TStringList.Create;
  80. try
  81. tmpSs.Assign(lstFiles.Items);
  82. tmpSs.Sorted := True;
  83. for i := 0 to ss.Count - 1 do
  84. begin
  85. if FileExists(ss[i]) then
  86. begin
  87. tmpSs.Add(ss[i]);
  88. end;
  89. end;
  90. lstFiles.Items.Assign(tmpSs);
  91. finally
  92. tmpSs.Free;
  93. end;
  94. end;
  95. procedure TfrmMain.AnalyseAFile(const FileName: string; AllowException: Boolean = False);
  96. begin
  97. try
  98. FAnalyseResults.AddFile(FileName);
  99. except
  100. if AllowException then
  101. begin
  102. raise;
  103. end;
  104. end;
  105. end;
  106. procedure TfrmMain.AnalyseAllFiles(var Errors: string);
  107. var
  108. i: Integer;
  109. begin
  110. FAnalyseResults.BeginUpdate;
  111. try
  112. FAnalyseResults.Clear;
  113. for i := 0 to lstFiles.Items.Count - 1 do
  114. begin
  115. try
  116. AnalyseAFile(lstFiles.Items[i], True);
  117. except
  118. on E: Exception do
  119. begin
  120. Errors := Errors + E.Message + #13#10;
  121. end;
  122. end;
  123. end;
  124. finally
  125. FAnalyseResults.EndUpdate;
  126. end;
  127. end;
  128. procedure TfrmMain.Analysing(b: Boolean);
  129. begin
  130. FAnalysing := b;
  131. UpdateControlsState;
  132. end;
  133. procedure TfrmMain.btnAnalyseClick(Sender: TObject);
  134. var
  135. Errors: string;
  136. I, J: Integer;
  137. S: string;
  138. begin
  139. Analysing(True);
  140. try
  141. Errors := '';
  142. AnalyseAllFiles(Errors);
  143. if Errors <> '' then
  144. begin
  145. raise Exception.Create(SCnSomeAnalyzedFailed + Errors);
  146. end;
  147. finally
  148. Analysing(False);
  149. end;
  150. for I := 0 to FAnalyseResults.Count - 1 do
  151. begin
  152. for J := 0 to FAnalyseResults.PackageInfos[I].Units.Count - 1 do
  153. begin
  154. S := FAnalyseResults.PackageInfos[I].Units.Strings[J];
  155. if ((LeftStr(S, 2) = 'cx') or (LeftStr(S, 2) = 'dx'))
  156. and (mmoDevUnits.Lines.IndexOf(S) = -1) then
  157. mmoDevUnits.Lines.Add(S);
  158. end;
  159. end;
  160. end;
  161. procedure TfrmMain.btnClearFilesClick(Sender: TObject);
  162. begin
  163. FAnalyseResults.Clear;
  164. lstFiles.Clear;
  165. mmoDevUnits.Clear;
  166. UpdateControlsState;
  167. end;
  168. procedure TfrmMain.btnCopyUnitsClick(Sender: TObject);
  169. var
  170. I: Integer;
  171. sF, sT: string;
  172. begin
  173. if not DirectoryExists(edtTOPath.Text) then
  174. ForceDirectories(edtTOPath.Text);
  175. for I := 0 to mmoDevUnits.Lines.Count - 1 do
  176. begin
  177. sF := edtDEPath.Text + mmoDevUnits.Lines.Strings[I];
  178. sT := edtTOPath.Text + mmoDevUnits.Lines.Strings[I];
  179. //if FileExists(sF + '.dfm') then
  180. // CopyFile(PChar(sF + '.dfm'),PChar(sT + '.dfm'), True);
  181. if FileExists(sF + '.dcu') then
  182. CopyFile(PChar(sF + '.dcu'), PChar(sT + '.dcu'), True)
  183. else
  184. mmoLog.Lines.Add(SF);
  185. end;
  186. end;
  187. procedure TfrmMain.btnOpenFilesClick(Sender: TObject);
  188. begin
  189. if dlgOpen.Execute then
  190. begin
  191. AddFiles(dlgOpen.Files);
  192. UpdateControlsState;
  193. end;
  194. end;
  195. procedure TfrmMain.FormCreate(Sender: TObject);
  196. begin
  197. FAnalyseResults := TPackageInfosList.Create;
  198. FAnalyseResults.Sorted := True;
  199. FAnalyseResults.StringProcessProc := StringProcessProc;
  200. end;
  201. procedure TfrmMain.FormDestroy(Sender: TObject);
  202. begin
  203. FAnalyseResults.Free;
  204. end;
  205. function TfrmMain.GetSelectedFile: string;
  206. begin
  207. Result := '';
  208. if lstFiles.ItemIndex >= 0 then
  209. begin
  210. Result := lstFiles.Items[lstFiles.ItemIndex];
  211. end;
  212. end;
  213. function TfrmMain.IndexOfAnalyseResult(const s: string): Integer;
  214. begin
  215. Result := -1;
  216. if s = '' then
  217. begin
  218. Exit;
  219. end;
  220. Result := FAnalyseResults.IndexOf(s);
  221. end;
  222. procedure TfrmMain.lstFilesClick(Sender: TObject);
  223. begin
  224. UpdateControlsState;
  225. end;
  226. procedure TfrmMain.lstFilesKeyUp(Sender: TObject; var Key: Word;
  227. Shift: TShiftState);
  228. begin
  229. if FPerformUIUpdating then
  230. begin
  231. UpdateControlsState;
  232. end;
  233. end;
  234. procedure TfrmMain.UpdateAnalyseResultView;
  235. begin
  236. UpdateAnalyseResultView(FAnalyseResults.PackageInfos[IndexOfAnalyseResult(GetSelectedFile)]);
  237. end;
  238. procedure TfrmMain.UpdateAnalyseResultView(ssUnits, ssRequirePackages: TStrings);
  239. begin
  240. if Assigned(ssUnits) then
  241. mmoUnits.Lines.Assign(ssUnits);
  242. if Assigned(ssRequirePackages) then
  243. begin
  244. mmoRequirePackages.Lines.Text :=AnsiString(ssRequirePackages.Text);
  245. //mmoRequirePackages.Lines.Assign(ssRequirePackages);
  246. end;
  247. end;
  248. procedure TfrmMain.UpdateAnalyseResultView(PPI: PPackageInfos);
  249. begin
  250. if PPI = nil then
  251. begin
  252. UpdateAnalyseResultView(nil, nil);
  253. end
  254. else
  255. begin
  256. UpdateAnalyseResultView(PPI.Units, PPI.RequiredPackages);
  257. end;
  258. end;
  259. procedure TfrmMain.UpdateControlsState;
  260. var
  261. bEnabled: Boolean;
  262. begin
  263. if FUIUpdating then
  264. begin
  265. Exit;
  266. end;
  267. FUIUpdating := True;
  268. try
  269. bEnabled := not FAnalysing;
  270. btnOpenFiles.Enabled := bEnabled;
  271. btnAnalyse.Enabled := bEnabled and (lstFiles.Items.Count > 0);
  272. btnClearFiles.Enabled := btnAnalyse.Enabled;
  273. lstFiles.Enabled := bEnabled;
  274. finally
  275. UpdateAnalyseResultView;
  276. FUIUpdating := False;
  277. end;
  278. end;
  279. procedure TfrmMain.FormShow(Sender: TObject);
  280. var
  281. I: Integer;
  282. begin
  283. for i := 0 to ControlCount - 1 do
  284. begin
  285. if Controls[i] is TButton then
  286. begin
  287. with TButton(Controls[i]) do
  288. begin
  289. Caption := StringReplace(Caption, ' ', #13#10, [rfReplaceAll]);
  290. end;
  291. end;
  292. end;
  293. UpdateControlsState;
  294. end;
  295. end.