ProjectManagerDm.pas 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. unit ProjectManagerDm;
  2. interface
  3. uses
  4. TenderBackupManager,
  5. SysUtils, Classes, DB, DBClient, Provider, ADODB, Connections, ZhAPI,
  6. sdDB, sdProvider, sdIDTree;
  7. type
  8. TProjectManagerData = class(TDataModule)
  9. sdpProjectsInfo: TsdADOProvider;
  10. sddProjectsInfo: TsdDataSet;
  11. sdvProjectsInfo: TsdDataView;
  12. sdpTenderProperty: TsdADOProvider;
  13. sddTenderProperty: TsdDataSet;
  14. sdvTenderProperty: TsdDataView;
  15. sdvProjectsSpare: TsdDataView;
  16. procedure sdvProjectsInfoGetText(var Text: String;
  17. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  18. DisplayText: Boolean);
  19. procedure sdvProjectsInfoFilterRecord(ARecord: TsdDataRecord;
  20. var Allow: Boolean);
  21. procedure DataModuleCreate(Sender: TObject);
  22. procedure sdvProjectsInfoBeforeDeleteRecord(ARecord: TsdDataRecord;
  23. var Allow: Boolean);
  24. private
  25. FConnection: TCommonConnection;
  26. FProjectsTree: TsdIDTree;
  27. procedure UpdateManagerDataBase;
  28. //procedure ReNameCurrentProject(const AName: string);
  29. procedure CreateNewProjectFile(const AName: string);
  30. procedure DeleteAllTenderFiles(ANode: TsdIDTreeNode);
  31. procedure DeleteAttachmentFiles(ANode: TsdIDTreeNode);
  32. function CreateBackupFolder(AProjectID: Integer): string;
  33. procedure ExportTender(ARec: TsdDataRecord; AFileName: string);
  34. function NewID: Integer;
  35. public
  36. constructor Create;
  37. destructor Destroy; override;
  38. procedure Open;
  39. procedure Save;
  40. function HasProject: Boolean;
  41. function ExistProject(const AName: string; ANode: TsdIDTreeNode): Boolean;
  42. function ProjectID(const AName: string; ANode: TsdIDTreeNode): Integer;
  43. // 云版要记下网络文件夹的ID和层次。
  44. function InsertProject(const AName: string; APreNode: TsdIDTreeNode; AFolderID: Integer = -1; AFolderLevel: Integer = -1): TsdIDTreeNode;
  45. function InsertSubProject(const AName: string; AParent: TsdIDTreeNode; AFolderID: Integer = -1; AFolderLevel: Integer = -1): TsdIDTreeNode;
  46. function InsertTender(const AName: string; AParent: TsdIDTreeNode): TsdIDTreeNode;
  47. procedure Delete;
  48. procedure ReName(const AName: string; ANode: TsdIDTreeNode);
  49. procedure RestoreTender(AID: Integer);
  50. procedure RefreshSeedID;
  51. function BackupPath(AProjectID: Integer): String;
  52. procedure AddOpenTenderBackup(AProjectID: Integer);
  53. procedure AddSaveTenderBackup(AProjectID: Integer);
  54. property ProjectsTree: TsdIDTree read FProjectsTree;
  55. end;
  56. implementation
  57. uses
  58. UtilMethods, UpdateDataBase, ProjectCommands, PHPWebDm, ConstUnit;
  59. {$R *.dfm}
  60. { TProjectManagerData }
  61. constructor TProjectManagerData.Create;
  62. begin
  63. inherited Create(nil);
  64. FConnection := TCommonConnection.Create;
  65. FProjectsTree := TsdIDTree.Create;
  66. FProjectsTree.KeyFieldName := 'ID';
  67. FProjectsTree.ParentFieldName := 'ParentID';
  68. FProjectsTree.NextSiblingFieldName := 'NextSiblingID';
  69. FProjectsTree.AutoCreateKeyID := True;
  70. FProjectsTree.AutoExpand := True;
  71. FProjectsTree.SeedID := 1;
  72. FProjectsTree.DataView := sdvProjectsInfo;
  73. end;
  74. procedure TProjectManagerData.CreateNewProjectFile(const AName: string);
  75. var
  76. TempFolder: string;
  77. begin
  78. try
  79. TempFolder := GenerateTempFolder(GetTempFilePath);
  80. CopyFileOrFolder(GetEmptyDataBaseFileName, TempFolder + '\Main.dat');
  81. ZipFolder(TempFolder, GetMyProjectsFilePath + AName);
  82. finally
  83. DeleteFileOrFolder(TempFolder);
  84. end;
  85. end;
  86. procedure TProjectManagerData.Delete;
  87. begin
  88. if HasProject then
  89. begin
  90. DeleteAttachmentFiles(FProjectsTree.Selected);
  91. DeleteAllTenderFiles(FProjectsTree.Selected);
  92. FProjectsTree.DeleteNode(FProjectsTree.Selected);
  93. Save;
  94. end;
  95. end;
  96. destructor TProjectManagerData.Destroy;
  97. begin
  98. FProjectsTree.Free;
  99. FConnection.Free;
  100. inherited;
  101. end;
  102. function TProjectManagerData.ExistProject(const AName: string;
  103. ANode: TsdIDTreeNode): Boolean;
  104. var
  105. vCur: TsdIDTreeNode;
  106. begin
  107. Result := False;
  108. if not Assigned(ANode) then Exit;
  109. vCur := ANode.FirstChild;
  110. while not Result and Assigned(vCur) do
  111. begin
  112. Result := vCur.Rec.ValueByName('Name').AsString = AName;
  113. vCur := vCur.NextSibling;
  114. end;
  115. end;
  116. function TProjectManagerData.HasProject: Boolean;
  117. begin
  118. Result := sddProjectsInfo.RecordCount > 0;
  119. end;
  120. function TProjectManagerData.InsertProject(const AName: string;
  121. APreNode: TsdIDTreeNode; AFolderID: Integer; AFolderLevel: Integer): TsdIDTreeNode;
  122. var
  123. vNew: TsdIDTreeNode;
  124. bOnLine, bCanCreate: Boolean;
  125. begin
  126. // 云版判断是否已存在的标准是服务端传来的ID,不是单机版所使用的名称。
  127. // 判断条件写在这里面不合适,因为云版调用不正确,应该写到方法外面。
  128. // 现在已经这样了,改起来麻烦,先补丁的方式用着。
  129. if G_IsCloud then
  130. bCanCreate := True
  131. else if (not G_IsCloud) and (not Assigned(APreNode)
  132. or not ExistProject(AName, APreNode.Parent)) then
  133. bCanCreate := True
  134. else
  135. bCanCreate := False;
  136. if bCanCreate then
  137. begin
  138. RefreshSeedID;
  139. if Assigned(APreNode) then
  140. vNew := FProjectsTree.Add(APreNode.ParentID, APreNode.NextSiblingID)
  141. else
  142. vNew := FProjectsTree.Add(-1, -1);
  143. vNew.Rec.BeginUpdate;
  144. vNew.Rec.ValueByName('Type').AsInteger := 0;
  145. vNew.Rec.ValueByName('Name').AsString := AName;
  146. {---------------------------------------------------------------------------
  147. 恼火的问题:直接写成下面这样,则第二句编译不进:
  148. if G_IsOnLine then
  149. vNew.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
  150. 这里用局部变量bOnLine转接一下,能解决问题。
  151. ---------------------------------------------------------------------------}
  152. bOnLine := G_IsCloud;
  153. if bOnLine then
  154. begin
  155. vNew.Rec.ValueByName('WebID').AsInteger := AFolderID;
  156. vNew.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
  157. vNew.Rec.ValueByName('WebFolderLevel').AsInteger := AFolderLevel;
  158. end;
  159. vNew.Rec.EndUpdate;
  160. Result := vNew;
  161. Save;
  162. end
  163. else
  164. raise Exception.Create('存在同名类别!');
  165. end;
  166. function TProjectManagerData.InsertSubProject(const AName: string;
  167. AParent: TsdIDTreeNode; AFolderID: Integer; AFolderLevel: Integer): TsdIDTreeNode;
  168. var
  169. vNew: TsdIDTreeNode;
  170. bOnLine, bCanCreate: Boolean;
  171. begin
  172. if G_IsCloud then
  173. bCanCreate := True
  174. else if (not G_IsCloud) and (not ExistProject(AName, AParent)) then
  175. bCanCreate := True
  176. else
  177. bCanCreate := False;
  178. if bCanCreate then
  179. begin
  180. RefreshSeedID;
  181. vNew := FProjectsTree.Add(AParent.ID, -1);
  182. vNew.Rec.ValueByName('Type').AsInteger := 0;
  183. vNew.Rec.ValueByName('Name').AsString := AName;
  184. {---------------------------------------------------------------------------
  185. 恼火的问题:直接写成下面这样,则第二句编译不进:
  186. if G_IsOnLine then
  187. vNew.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
  188. 这里用局部变量bOnLine转接一下,能解决问题。
  189. ---------------------------------------------------------------------------}
  190. bOnLine := G_IsCloud;
  191. if bOnLine then
  192. begin
  193. vNew.Rec.ValueByName('WebID').AsInteger := AFolderID;
  194. vNew.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
  195. vNew.Rec.ValueByName('WebFolderLevel').AsInteger := AFolderLevel;
  196. end;
  197. Result := vNew;
  198. Save;
  199. end
  200. else
  201. raise Exception.Create('存在同名类别!');
  202. end;
  203. function TProjectManagerData.InsertTender(const AName: string;
  204. AParent: TsdIDTreeNode): TsdIDTreeNode;
  205. var bOnLine: Boolean;
  206. begin
  207. if not ExistProject(AName, AParent) then
  208. begin
  209. RefreshSeedID;
  210. Result := FProjectsTree.Add(AParent.ID, -1);
  211. {---------------------------------------------------------------------------
  212. 恼火的问题:直接写成下面这样,则第二句编译不进:
  213. if G_IsOnLine then
  214. Result.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
  215. 这里用局部变量bOnLine转接一下,能解决问题。
  216. ---------------------------------------------------------------------------}
  217. // if G_IsOnLine then
  218. // Result.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID; // 编译不进
  219. bOnLine := G_IsCloud;
  220. if bOnLine then
  221. Result.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
  222. Result.Rec.ValueByName('Type').AsInteger := 1;
  223. Result.Rec.ValueByName('Name').AsString := AName;
  224. Result.Rec.ValueByName('PhaseCount').AsInteger := 0;
  225. Result.Rec.ValueByName('AuditStatus').AsInteger := 0;
  226. Result.Rec.ValueByName('FileName').AsString :=
  227. ExtractSimpleFileName(GetNewGUIDFileName(GetMyProjectsFilePath));
  228. Result.Rec.ValueByName('CreateDate').AsString := FormatDateTime('yyyy-mm-dd', Date);
  229. CreateNewProjectFile(Result.Rec.ValueByName('FileName').AsString);
  230. Save;
  231. end
  232. else
  233. raise Exception.Create('存在同名标段!');
  234. end;
  235. procedure TProjectManagerData.Open;
  236. var
  237. sFileName: string;
  238. FQuery: TADOQuery;
  239. begin
  240. sFileName := GetAppFilePath + 'Data\ProjectManager.dat';
  241. if FileEncrypted(sFileName) then
  242. SimpleDecrypt(sFileName, sFileName);
  243. FConnection.Open(sFileName);
  244. UpdateManagerDataBase;
  245. sdpProjectsInfo.Connection := FConnection.Connection;
  246. sddProjectsInfo.Open;
  247. sdvProjectsInfo.Open;
  248. sdvProjectsSpare.Open;
  249. sddProjectsInfo.AddIndex('idxID', 'ID');
  250. sdvProjectsInfo.IndexName := 'idxID';
  251. sdpTenderProperty.Connection := FConnection.Connection;
  252. sddTenderProperty.Open;
  253. sdvTenderProperty.Open;
  254. end;
  255. procedure TProjectManagerData.Save;
  256. begin
  257. sddTenderProperty.Save;
  258. sddProjectsInfo.Save;
  259. FConnection.Save;
  260. end;
  261. procedure TProjectManagerData.UpdateManagerDataBase;
  262. var
  263. vUpdator: TUpdateManagerDB;
  264. begin
  265. vUpdator := TUpdateManagerDB.Create;
  266. try
  267. vUpdator.Update(FConnection);
  268. finally
  269. vUpdator.Free;
  270. end;
  271. end;
  272. procedure TProjectManagerData.sdvProjectsInfoGetText(var Text: String;
  273. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  274. DisplayText: Boolean);
  275. function NumToAuditStatus(AValue: Integer): string;
  276. begin
  277. case AValue of
  278. -1:
  279. if ARecord.ValueByName('PhaseCount').AsInteger = 0 then
  280. Result := '原报'
  281. else
  282. Result := '批复';
  283. 0:
  284. Result := '原报';
  285. else
  286. Result := Format('%d 审', [AValue]);
  287. end;
  288. end;
  289. begin
  290. if not Assigned(ARecord) then Exit;
  291. if SameText(AColumn.FieldName, 'AuditStatus') then
  292. if ARecord.ValueByName('Type').AsInteger = 1 then
  293. Text := NumToAuditStatus(AValue.AsInteger)
  294. else
  295. Text := '';
  296. end;
  297. procedure TProjectManagerData.DeleteAllTenderFiles(ANode: TsdIDTreeNode);
  298. var
  299. iChild: Integer;
  300. begin
  301. if ANode.HasChildren then
  302. for iChild := 0 to ANode.ChildCount - 1 do
  303. DeleteAllTenderFiles(ANode.ChildNodes[iChild])
  304. else if ANode.Rec.ValueByName('Type').AsInteger = 1 then
  305. DeleteFile(GetMyProjectsFilePath + ANode.Rec.ValueByName('FileName').AsString);
  306. end;
  307. procedure TProjectManagerData.ReName(const AName: string;
  308. ANode: TsdIDTreeNode);
  309. begin
  310. ANode.Rec.ValueByName('Name').AsString := AName;
  311. Save;
  312. end;
  313. procedure TProjectManagerData.RestoreTender(AID: Integer);
  314. var
  315. vNode: TsdIDTreeNode;
  316. sRestoreFile: string;
  317. Exportor: TTenderExport;
  318. begin
  319. vNode := FProjectsTree.FindNode(AID);
  320. if not FileExists(GetMyProjectsFilePath + vNode.Rec.ValueByName('FileName').AsString) then Exit;
  321. sRestoreFile := GetBackUpFilePath + vNode.Rec.ValueByName('Name').AsString
  322. + '[' + FormatDateTime('yyyy-mm-dd hh,nn,ss', Now) + '].mtf';
  323. Exportor := TTenderExport.Create(vNode.Rec, sRestoreFile);
  324. try
  325. Exportor.Execute;
  326. finally
  327. Exportor.Free;
  328. end;
  329. end;
  330. procedure TProjectManagerData.sdvProjectsInfoFilterRecord(
  331. ARecord: TsdDataRecord; var Allow: Boolean);
  332. begin
  333. if G_IsCloud then
  334. begin
  335. if ARecord.ValueByName('WebUserID').AsInteger = PHPWeb.UserID then
  336. Allow := True
  337. else
  338. Allow := False;
  339. end
  340. else
  341. begin
  342. if ARecord.ValueByName('WebUserID').AsInteger = 0 then
  343. Allow := True
  344. else
  345. Allow := False;
  346. end;
  347. end;
  348. procedure TProjectManagerData.DataModuleCreate(Sender: TObject);
  349. begin
  350. // 单机版也要过滤:防止单机版程序能显示所有用户的项目。
  351. // if G_IsOnLine then
  352. sdvProjectsInfo.Filtered := True;
  353. sdvProjectsSpare.Filtered := True;
  354. end;
  355. function TProjectManagerData.NewID: Integer;
  356. var
  357. idxID: TsdIndex;
  358. begin
  359. if sddProjectsInfo.RecordCount > 0 then
  360. begin
  361. idxID := sddProjectsInfo.FindIndex('idxID');
  362. Result := idxID.Records[idxID.RecordCount - 1].ValueByName('ID').AsInteger + 1;
  363. end
  364. else
  365. Result := 1;
  366. end;
  367. procedure TProjectManagerData.RefreshSeedID;
  368. begin
  369. FProjectsTree.SeedID := NewID;
  370. end;
  371. function TProjectManagerData.BackupPath(AProjectID: Integer): String;
  372. var
  373. Rec: TsdDataRecord;
  374. begin
  375. Result := GetAppFilePath + 'FileBackup\TenderBackup';
  376. Rec := ProjectsTree.FindNode(AProjectID).Rec;
  377. if Rec.ValueByName('BackupFolder').AsString = '' then
  378. Rec.ValueByName('BackupFolder').AsString := CreateBackupFolder(AProjectID);
  379. Result := Result + '\' + Rec.ValueByName('BackupFolder').AsString + '\';
  380. end;
  381. function TProjectManagerData.CreateBackupFolder(
  382. AProjectID: Integer): string;
  383. function GetParentNames(ANode: TsdIDTreeNode): string;
  384. var
  385. stnParent: TsdIDTreeNode;
  386. begin
  387. Result := '';
  388. stnParent := ANode.Parent;
  389. while Assigned(stnParent) do
  390. begin
  391. if Result <> '' then
  392. Result := stnParent.Rec.ValueByName('Name').AsString + '--' + Result
  393. else
  394. Result := stnParent.Rec.ValueByName('Name').AsString;
  395. stnParent := stnParent.Parent;
  396. end;
  397. end;
  398. var
  399. stnNode: TsdIDTreeNode;
  400. sGUID, sPath: string;
  401. sgs: TStringList;
  402. begin
  403. stnNode := ProjectsTree.FindNode(AProjectID);
  404. Result := stnNode.Rec.ValueByName('BackupFolder').AsString;
  405. if Result <> '' then Exit;
  406. sPath := GetAppFilePath + 'FileBackup\TenderBackup\';
  407. sGUID := GetNewGUIDFileName(sPath);
  408. if FileExists(sGUID) then DeleteFile(sGUID);
  409. CreateDirectoryInDeep(sGUID);
  410. sgs := TStringList.Create;
  411. try
  412. sgs.Add('项目备份文件夹');
  413. sgs.Add(Format('项目名称:%s', [stnNode.Rec.ValueByName('Name').AsString]));
  414. sgs.Add(Format('所属项目:%s', [GetParentNames(stnNode)]));
  415. sgs.Add(Format('创建时间:%s', [DateTimeToStr(Now)]));
  416. finally
  417. sgs.SaveToFile(sGUID + '\说明.txt');
  418. sgs.Free;
  419. end;
  420. Result := ExtractSimpleFileName(sGUID)
  421. end;
  422. procedure TProjectManagerData.sdvProjectsInfoBeforeDeleteRecord(
  423. ARecord: TsdDataRecord; var Allow: Boolean);
  424. var
  425. sOrgFolder, sNewFolder: string;
  426. begin
  427. if ARecord.ValueByName('BackupFolder').AsString <> '' then
  428. begin
  429. sOrgFolder := GetAppFilePath + 'FileBackup\TenderBackup\'
  430. + ARecord.ValueByName('BackupFolder').AsString;
  431. sNewFolder := GetAppFilePath + 'FileBackup\RecycleBackup\'
  432. + ARecord.ValueByName('BackupFolder').AsString;
  433. CopyFileOrFolder(sOrgFolder, sNewFolder);
  434. DeleteFileOrFolder(sOrgFolder);
  435. end;
  436. end;
  437. procedure TProjectManagerData.AddOpenTenderBackup(AProjectID: Integer);
  438. var
  439. vBackupManager: TBackupManager;
  440. BackupRec, Rec: TsdDataRecord;
  441. sBackupFile: string;
  442. begin
  443. Rec := sddProjectsInfo.FindKey('idxID', AProjectID);
  444. if not Assigned(Rec) then Exit;
  445. vBackupManager := TBackupManager.Create;
  446. try
  447. vBackupManager.LoadBackupFile(BackupPath(AProjectID));
  448. if vBackupManager.LastestOpenBackupIsToday then Exit;
  449. sBackupFile := vBackupManager.OpenBackupFile;
  450. if FileExists(sBackupFile) then DeleteFile(sBackupFile);
  451. ExportTender(Rec, sBackupFile);
  452. finally
  453. vBackupManager.Free;
  454. end;
  455. end;
  456. procedure TProjectManagerData.AddSaveTenderBackup(AProjectID: Integer);
  457. var
  458. vBackupManager: TBackupManager;
  459. BackupRec, Rec: TsdDataRecord;
  460. sBackupFile: string;
  461. begin
  462. Rec := sddProjectsInfo.FindKey('idxID', AProjectID);
  463. if not Assigned(Rec) then Exit;
  464. vBackupManager := TBackupManager.Create;
  465. try
  466. vBackupManager.LoadBackupFile(BackupPath(AProjectID));
  467. sBackupFile := vBackupManager.SaveBackupFile;
  468. if FileExists(sBackupFile) then DeleteFile(sBackupFile);
  469. ExportTender(Rec, sBackupFile);
  470. finally
  471. vBackupManager.Free;
  472. end;
  473. end;
  474. procedure TProjectManagerData.ExportTender(ARec: TsdDataRecord;
  475. AFileName: string);
  476. var
  477. Exportor : TTenderExport;
  478. begin
  479. Exportor := TTenderExport.Create(ARec, AFileName);
  480. try
  481. Exportor.Execute;
  482. finally
  483. Exportor.Free;
  484. end;
  485. end;
  486. function TProjectManagerData.ProjectID(const AName: string;
  487. ANode: TsdIDTreeNode): Integer;
  488. var
  489. vCur: TsdIDTreeNode;
  490. begin
  491. Result := -1;
  492. if not Assigned(ANode) then Exit;
  493. vCur := ANode.FirstChild;
  494. while (Result = -1) and Assigned(vCur) do
  495. begin
  496. if vCur.Rec.ValueByName('Name').AsString = AName then
  497. Result := vCur.ID;
  498. vCur := vCur.NextSibling;
  499. end;
  500. end;
  501. procedure TProjectManagerData.DeleteAttachmentFiles(ANode: TsdIDTreeNode);
  502. var sDir: string;
  503. procedure DeleteAtch(ANode: TsdIDTreeNode);
  504. begin
  505. // 如果文件名为空,删除时会删除整个附件文件夹,危险!
  506. if ANode.Rec.ValueByName('FileName').AsString = '' then Exit;
  507. sDir := GetMyProjectsFilePath + 'Attachment\' + ANode.Rec.ValueByName('FileName').AsString;
  508. DeleteFolder(sDir);
  509. end;
  510. procedure DeleteNodes(ANode: TsdIDTreeNode);
  511. begin
  512. if ANode = nil then Exit;
  513. if ANode.FirstChild <> nil then
  514. DeleteNodes(ANode.FirstChild);
  515. if ANode.Rec.ValueByName('Type').AsInteger = 1 then
  516. DeleteAtch(ANode);
  517. if ANode.NextSibling <> nil then
  518. DeleteNodes(ANode.NextSibling);
  519. end;
  520. begin
  521. if not G_IsCloud then
  522. begin
  523. if not Assigned(ANode) then Exit;
  524. if ANode.Rec.ValueByName('Type').AsInteger = 0 then
  525. begin
  526. if Assigned(ANode.FirstChild) then
  527. DeleteNodes(ANode.FirstChild);
  528. end
  529. else
  530. DeleteAtch(ANode);
  531. end;
  532. end;
  533. end.