ScProjectManager.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  1. unit ScProjectManager;
  2. interface
  3. uses
  4. DataBase,
  5. Classes,
  6. ScFileArchiver,
  7. ConstTypeUnit,
  8. Windows,
  9. BillsProjectFrame,
  10. ConstVarUnit,
  11. ScUpdateDataBase,
  12. Forms,
  13. Variants,
  14. HisRestorePointDM,
  15. ScExprsDM,
  16. ProjectPropertyDM,
  17. ImportExcel,
  18. ADODB,
  19. DetailItemsDM,
  20. ExportExcel,
  21. ScReportDM,
  22. RecycleBinDM;
  23. type
  24. TProject = class
  25. private
  26. FID : Integer;
  27. FFlag : Integer;
  28. FParentID : Integer;
  29. FNavigation : Integer;
  30. FFilePath : string;
  31. FProjectName : string;
  32. FChanged : Boolean;
  33. FDMExprs : TDMExprs;
  34. FStdBillsCtrl : TObject;
  35. FBillsData : TDMDataBase;
  36. FProjPropertyDM : TProjPropertyDM;
  37. FRecycleBinData : TRecycleBinData;
  38. FDMHisPoint : TDMHisRestorePoint;
  39. FProjectView : TBillsProjectView;
  40. FDetailItemsDM : TDMDetailItems;
  41. FArchiver : TScProjectFileArchiver;
  42. // chenshilong, 2011-01-13 11:23:05
  43. FReport : TReportData;
  44. FOpenForReport : Boolean;
  45. // 显示报表前要修改SerialNo,用完后会提示项目保存,加个条件不让提示
  46. FChangedByReport: Boolean;
  47. // 强制不保存。如新建项目后关闭,预览报表后关闭。
  48. FForceUndoSave: Boolean;
  49. procedure SetStdBillsCtrl(const Value: TObject);
  50. function NewFile(const aFileName, TempleteFile: string; var aNewName: string): Boolean;
  51. { save project }
  52. procedure InnerSave;
  53. procedure Save; overload;
  54. procedure InitNewProject;
  55. function GetProjectType: Integer;
  56. procedure SetProjectName(const Value: string);
  57. function GetConnection: TADOConnection;
  58. procedure SetBidLotList(const Value: TStrings);
  59. procedure SetFlag(const Value: Integer);
  60. public
  61. constructor Create(const FileName, aShortName: string; ProjectType, aID: Integer);
  62. destructor Destroy; override;
  63. procedure Save(const aCreatePoint: Boolean; aFixed: Boolean = False); overload;
  64. procedure SaveAs(const FileName: string);
  65. // Added by GiLi 2012-3-16 17:17:36
  66. // 重新设置文件的别名
  67. procedure ResetFileAlias(const sNewAlias: string);
  68. function NeedSaveDatabase: Boolean;
  69. { gather project }
  70. procedure CheckBeforeGather;
  71. function GetGatherID: Integer;
  72. function GatherProject(ANewProject: TProject): Boolean;
  73. { import excel file }
  74. procedure ImportExcelFile(const aFileName: string);
  75. procedure ImportQtyItems(const aFileName: string);
  76. procedure ExportExcel(aProjMgr: TObject; const aFileName: string; aStrings: TStrings; aFlag: Integer);
  77. procedure ExportFlatExcel(const AFileName: string);
  78. { 1. File Manager }
  79. property ID: Integer read FID;
  80. // Flag=1 : 建设项目 Flag=2 : 标段 Flag=3 : 项目清单
  81. property Flag: Integer read FFlag write SetFlag;
  82. property ParentID: Integer read FParentID write FParentID;
  83. property BidLotList: TStrings write SetBidLotList;
  84. { 2. Active Objects }
  85. property BillsData: TDMDataBase read FBillsData;
  86. property ProjPropertyDM: TProjPropertyDM read FProjPropertyDM;
  87. property DMHisPoint: TDMHisRestorePoint read FDMHisPoint;
  88. property ProjectView: TBillsProjectView read FProjectView;
  89. property StdBillsCtrl: TObject read FStdBillsCtrl write SetStdBillsCtrl;
  90. property DetailItemsDM: TDMDetailItems read FDetailItemsDM;
  91. property RecycleBinData: TRecycleBinData read FRecycleBinData;
  92. { 3. Connection }
  93. property Connection: TADOConnection read GetConnection;
  94. property Archiver: TScProjectFileArchiver read FArchiver;
  95. { 4. project Base Property }
  96. property Changed: Boolean read FChanged write FChanged;
  97. property FilePath: string read FFilePath write FFilePath;
  98. property ProjectName: string read FProjectName write SetProjectName;
  99. property ProjectType: Integer read GetProjectType;
  100. property Navigation: Integer read FNavigation write FNavigation;
  101. property Report: TReportData read FReport write FReport;
  102. property OpenForReport: Boolean read FOpenForReport write FOpenForReport;
  103. property ChangedByReport: Boolean read FChangedByReport write FChangedByReport;
  104. property ForceUndoSave: Boolean read FForceUndoSave write FForceUndoSave;
  105. end;
  106. TProjectManager = class
  107. private
  108. FProjectList: TList;
  109. FProjType: TScProjType;
  110. FActiveIndex: Integer;
  111. FActiveProject: TProject;
  112. function FindProject(const AIdx: Integer): TProject;
  113. function GetProjectCount: Integer;
  114. function GetProject(Idx: Integer): TProject;
  115. procedure SaveAllProjects(const aCreatePoint: Boolean);
  116. procedure SaveCurProject(const aCreatePoint: Boolean);
  117. public
  118. constructor Create;
  119. destructor Destroy; override;
  120. {open or create new project}
  121. function CreateNewProject(const FileName, aShortName: string; AStdBillsCtrl: TObject;
  122. AProjectType, aID: Integer): TProject;
  123. {find project by index}
  124. function LocateProject(const AIdx: Integer): Boolean;
  125. {remove project}
  126. function RemoveProject(Project: TProject = nil; AProject: TProject = nil; IsExist: Boolean = True): Integer;
  127. function RemoveProjectForClose(var CanColse: Boolean; Project: TProject = nil; AProject: TProject = nil; IsExist: Boolean = True): Integer;
  128. {save projects}
  129. procedure SaveProjects(const aSaveAll, aCreatePoint: Boolean);
  130. {find project by name}
  131. function CheckProjectExists(const AFileName: string): Integer;
  132. procedure ResetAllOpenProjectView;
  133. property Projects[Idx: Integer]: TProject read GetProject;
  134. property ProjectCount: Integer read GetProjectCount;
  135. property ActiveProject: TProject read FActiveProject;
  136. property ActiveIndex: Integer read FActiveIndex;
  137. property ProjectList: TList read FProjectList write FProjectList;
  138. // chenshilong, 2011-01-12 16:09:00
  139. // 为预览报表打开创建汇总项目
  140. function OpenProjectForReport(AFileName: string): TProject;
  141. // 关闭为预览报表而打开创建的汇总项目
  142. procedure CloseProjectsForReport;
  143. procedure SetReportsFirstGetData;
  144. function GetProjectByID(AID: Integer): TProject;
  145. end;
  146. implementation
  147. uses
  148. SysUtils,
  149. ConstMethodUnit,
  150. ScKindsOfTrees,
  151. ZjIDTree,
  152. ExportDecorateUnit,
  153. SMCells,
  154. SMXLS, MainForm, ProjectManagerDM, ScProgressFrm;
  155. { TProjectManager }
  156. function TProjectManager.CheckProjectExists(
  157. const AFileName: string): Integer;
  158. var
  159. I: Integer;
  160. project: TProject;
  161. begin
  162. Result := -1;
  163. for I := 0 to FProjectList.Count - 1 do
  164. begin
  165. project := TProject(FProjectList.List^[I]);
  166. if SameText(AFileName, project.FilePath) then
  167. begin
  168. Result := I;
  169. Break;
  170. end;
  171. end;
  172. end;
  173. constructor TProjectManager.Create;
  174. begin
  175. FProjectList := TList.Create;
  176. {$IFDEF _ScBills}
  177. FProjType := ptBills;
  178. {$ELSE}
  179. FProjType := ptBudget;
  180. {$ENDIF}
  181. end;
  182. function TProjectManager.CreateNewProject(const FileName, aShortName: string;
  183. AStdBillsCtrl: TObject; AProjectType, aID: Integer): TProject;
  184. var
  185. strName: string;
  186. begin
  187. case FProjType of
  188. ptBills:
  189. strName := BillsTemplateFile;
  190. ptBudget:
  191. strName := BudgetTemplateFile;
  192. end;
  193. Result := TProject.Create(FileName, aShortName, AProjectType, aID);
  194. Result.StdBillsCtrl := AStdBillsCtrl;
  195. FActiveIndex := FProjectList.Add(Result);
  196. FActiveProject := Result;
  197. end;
  198. procedure TProjectManager.CloseProjectsForReport;
  199. var
  200. I: Integer;
  201. vProject: TProject;
  202. begin
  203. for I := FProjectList.Count - 1 downto 0 do
  204. begin
  205. vProject := TProject(FProjectList[I]);
  206. if vProject.OpenForReport then
  207. begin
  208. vProject.Free;
  209. FProjectList.Delete(I);
  210. end;
  211. end;
  212. end;
  213. destructor TProjectManager.Destroy;
  214. var
  215. I: Integer;
  216. project: TProject;
  217. begin
  218. for I := FProjectList.Count - 1 downto 0 do
  219. begin
  220. project := TProject(FProjectList[I]);
  221. if MainFrm.IsSave then
  222. begin
  223. if project.NeedSaveDatabase then
  224. begin
  225. if MessageBox(0, PChar(Format('项目[%s]已被修改, 是否保存项目?', [project.ProjectName])),
  226. PChar('询问'), MB_YESNO or MB_ICONQUESTION or MB_TOPMOST) = IDYES then
  227. project.Save;
  228. end;
  229. end;
  230. project.Free;
  231. end;
  232. FProjectList.Free;
  233. inherited;
  234. end;
  235. function TProjectManager.FindProject(const AIdx: Integer): TProject;
  236. begin
  237. if (AIdx > -1) and (AIdx < FProjectList.Count) then
  238. Result := TProject(FProjectList[AIdx])
  239. else Result := nil;
  240. end;
  241. function TProjectManager.GetProject(Idx: Integer): TProject;
  242. begin
  243. if (Idx >= 0) and (Idx < FProjectList.Count) then
  244. Result := TProject(FProjectList.List^[Idx])
  245. else Result := nil;
  246. end;
  247. function TProjectManager.GetProjectCount: Integer;
  248. begin
  249. Result := FProjectList.Count;
  250. end;
  251. function TProjectManager.LocateProject(const AIdx: Integer): Boolean;
  252. var
  253. Project: TProject;
  254. begin
  255. Project := FindProject(AIdx);
  256. if Assigned(Project) then
  257. begin
  258. FActiveProject := Project;
  259. FActiveIndex := AIdx;
  260. Result := True;
  261. end
  262. else
  263. begin
  264. Result := False;
  265. FActiveIndex := -1;
  266. end;
  267. end;
  268. function TProjectManager.OpenProjectForReport(AFileName: string): TProject;
  269. var vArchiver: TScProjectFileArchiver;
  270. iIdx, ProID: Integer;
  271. sName, ProName: string;
  272. aqExec: TADOQuery;
  273. begin
  274. if not FileExists(AFileName) then
  275. begin
  276. Result := nil;
  277. Exit;
  278. end;
  279. vArchiver := nil;
  280. iIdx := CheckProjectExists(AFileName);
  281. if iIdx = -1 then
  282. begin
  283. CreateProgressForm(100);
  284. AddProgressForm(20, '汇总项目尚末打开,正在从后台打开……');
  285. try
  286. vArchiver := TScProjectFileArchiver.Create;
  287. vArchiver.FileName := AFileName;
  288. vArchiver.OpenFile;
  289. sName := ExtractFileName(AFileName);
  290. sName := Copy(sName, 1, Length(sName) - 4);
  291. with MainFrm.ProjectFileManager.ProjectMgrDM do
  292. begin
  293. aqExec := TADOQuery.Create(nil);
  294. try
  295. aqExec.Connection := aqGatherBid.Connection;
  296. aqExec.SQL.Add(Format('Select * from ProjectManager where Flag = 3 and UnKnowName = ''%s''', [sName]));
  297. aqExec.Open;
  298. if aqExec.RecordCount > 0 then
  299. begin
  300. ProID := aqExec.FieldByName('ID').AsInteger;
  301. ProName := aqExec.FieldByName('ProjectName').AsString;
  302. end
  303. else
  304. begin
  305. Result := nil;
  306. Exit;
  307. end;
  308. finally
  309. aqExec.Free;
  310. end;
  311. end;
  312. Result := TProject.Create(AFileName, ProName, -1, ProID);
  313. Result.OpenForReport := True;
  314. FProjectList.Add(Result);
  315. Result.BillsData.Connection := vArchiver.Connection;
  316. UpdateDB(vArchiver);
  317. vArchiver.Save;
  318. Result.BillsData.Active := True;
  319. Result.BillsData.ConnectionBillsTree;
  320. Result.Report.RefreshData;
  321. finally
  322. CloseProgressForm;
  323. end;
  324. end
  325. else
  326. begin
  327. Result := Projects[iIdx];
  328. Result.Report.RefreshData;
  329. end;
  330. if Assigned(vArchiver) then
  331. vArchiver.Free;
  332. end;
  333. function TProjectManager.RemoveProject(Project: TProject; AProject: TProject; IsExist: Boolean): Integer;
  334. var
  335. curProject: TProject;
  336. begin
  337. curProject := Project;
  338. if Assigned(Project) then Result := FProjectList.Remove(Project)
  339. else
  340. begin
  341. curProject := FActiveProject;
  342. Result := FProjectList.Remove(FActiveProject);
  343. end;
  344. if Assigned(curProject) then
  345. begin
  346. if curProject.NeedSaveDatabase then
  347. begin
  348. if IsExist then
  349. begin
  350. if MessageBox(0, PChar(Format('项目 [%s] 已被修改,是否保存?', [curProject.ProjectName])),
  351. PChar('询问'), MB_YESNO or MB_TOPMOST or MB_ICONQUESTION) = IDYES then
  352. curProject.Save(True);
  353. end
  354. else
  355. curProject.Save(True);
  356. end;
  357. curProject.Free;
  358. end;
  359. if Assigned(AProject) then FActiveProject := AProject
  360. else
  361. begin
  362. if FProjectList.Count = 0 then FActiveProject := nil
  363. else if Result < FProjectList.Count then
  364. FActiveProject := TProject(FProjectList[Result])
  365. else FActiveProject := TProject(FProjectList[Result - 1]);
  366. end;
  367. FActiveIndex := FProjectList.IndexOf(FActiveProject);
  368. end;
  369. procedure TProjectManager.SaveAllProjects(const aCreatePoint: Boolean);
  370. var
  371. I: Integer;
  372. project: TProject;
  373. begin
  374. for I := 0 to FProjectList.Count - 1 do
  375. begin
  376. project := TProject(FProjectList.List^[I]);
  377. if project.NeedSaveDatabase then project.Save(aCreatePoint);
  378. end;
  379. end;
  380. procedure TProjectManager.SaveCurProject(const aCreatePoint: Boolean);
  381. begin
  382. if Assigned(FActiveProject) and FActiveProject.NeedSaveDatabase then
  383. FActiveProject.Save(aCreatePoint);
  384. end;
  385. procedure TProjectManager.SaveProjects(const aSaveAll, aCreatePoint: Boolean);
  386. begin
  387. if aSaveAll then
  388. SaveAllProjects(aCreatePoint)
  389. else
  390. SaveCurProject(aCreatePoint);
  391. end;
  392. procedure TProjectManager.SetReportsFirstGetData;
  393. var
  394. I: Integer;
  395. vReport: TReportData;
  396. begin
  397. for I := 0 to FProjectList.Count - 1 do
  398. begin
  399. vReport := TProject(FProjectList[I]).Report;
  400. vReport.FirstGetData := True;
  401. end;
  402. end;
  403. function TProjectManager.GetProjectByID(AID: Integer): TProject;
  404. var i: Integer;
  405. begin
  406. Result := nil;
  407. for i := 0 to FProjectList.Count - 1 do
  408. begin
  409. if TProject(FProjectList[i]).ID = AID then
  410. begin
  411. Result := TProject(FProjectList[i]);
  412. Break;
  413. end;
  414. end;
  415. end;
  416. function TProjectManager.RemoveProjectForClose(var CanColse: Boolean; Project: TProject = nil;
  417. AProject: TProject = nil; IsExist: Boolean = True): Integer;
  418. var
  419. curProject: TProject;
  420. MQResult: Integer;
  421. begin
  422. curProject := Project;
  423. if not Assigned(Project) then
  424. begin
  425. curProject := FActiveProject;
  426. end;
  427. if Assigned(curProject) then
  428. begin
  429. if curProject.NeedSaveDatabase then
  430. begin
  431. if IsExist then
  432. begin
  433. MQResult := MessageBox(0, PChar(Format('项目 [%s] 已被修改,是否保存?', [curProject.ProjectName])), PChar('询问'), MB_YESNOCANCEL);
  434. case MQResult of
  435. ID_YES:
  436. begin
  437. CanColse := True;
  438. curProject.Save(True);
  439. end;
  440. ID_NO:
  441. begin
  442. CanColse := True;
  443. end;
  444. IDCANCEL:
  445. begin
  446. CanColse := False;
  447. Exit;
  448. end;
  449. end;
  450. end
  451. else
  452. curProject.Save(True);
  453. end
  454. else
  455. CanColse := True;
  456. if CanColse then
  457. Result := FProjectList.Remove(curProject);
  458. curProject.Free;
  459. end;
  460. if Assigned(AProject) then
  461. FActiveProject := AProject
  462. else
  463. begin
  464. if FProjectList.Count = 0 then FActiveProject := nil
  465. else if Result < FProjectList.Count then
  466. FActiveProject := TProject(FProjectList[Result])
  467. else FActiveProject := TProject(FProjectList[Result - 1]);
  468. end;
  469. FActiveIndex := FProjectList.IndexOf(FActiveProject);
  470. end;
  471. procedure TProjectManager.ResetAllOpenProjectView;
  472. var
  473. i: Integer;
  474. begin
  475. for i := 0 to FProjectList.Count - 1 do
  476. TProject(FProjectList.Items[i]).ProjectView.LoadBillsViewOption;
  477. end;
  478. { TProject }
  479. constructor TProject.Create(const FileName, aShortName: string;
  480. ProjectType, aID: Integer);
  481. var
  482. strNewPath: string;
  483. begin
  484. FOpenForReport := False;
  485. FChangedByReport := False;
  486. FForceUndoSave := False;
  487. strNewPath := FileName;
  488. {project file path}
  489. FFilePath := strNewPath;
  490. FID := aID;
  491. FArchiver := TScProjectFileArchiver.Create;
  492. FArchiver.FileName := strNewPath;
  493. // Added by GiLi 2012-3-16 16:09:41
  494. FArchiver.Alias := '三级清单';
  495. FArchiver.OpenFile;
  496. if FArchiver.IsStdFile then
  497. begin
  498. FArchiver.IsStdFile := False;
  499. FChanged := True;
  500. end;
  501. PScFileHead(@FArchiver.FileInfo).ProductName := ConstProductName;
  502. FChanged := True;
  503. FBillsData := TDMDataBase.Create(Self);
  504. FBillsData.Connection := FArchiver.Connection;
  505. UpdateDB(FArchiver);
  506. {先打开数据,然后连接界面,效率快些}
  507. FBillsData.Active := True;
  508. FDMExprs := TDMExprs.Create(nil);
  509. FDMExprs.Connection := FArchiver.Connection;
  510. FBillsData.DMExprs := FDMExprs;
  511. if ProjectType <> -1 then
  512. begin
  513. FBillsData.DeleteAllBills(False);
  514. InitNewProject;
  515. end;
  516. FBillsData.ConnectionBillsTree;
  517. FDMHisPoint := TDMHisRestorePoint.Create(nil);
  518. FDMHisPoint.Connection := FArchiver.Connection;
  519. FDMHisPoint.ProjectPath := FFilePath;
  520. FDMHisPoint.ProjectName := aShortName;
  521. {修改项目属性}
  522. FProjPropertyDM := TProjPropertyDM.Create(nil);
  523. FProjPropertyDM.Connection := FArchiver.Connection;
  524. if ProjectType <> -1 then
  525. begin
  526. FProjPropertyDM.EditProjProperty(ProjectType);
  527. FProjPropertyDM.Save;
  528. // Added by GiLi 2012-3-16 16:09:41
  529. FArchiver.Alias := aShortName;
  530. FArchiver.Save;
  531. end;
  532. // Added by GiLi 2012-3-16 19:01:19
  533. FArchiver.Alias := aShortName;
  534. FDetailItemsDM := TDMDetailItems.Create(Self);
  535. FRecycleBinData := TRecycleBinData.Create(nil);
  536. FRecycleBinData.Connection := FArchiver.Connection;
  537. FReport := TReportData.Create(nil);
  538. FReport.Project := Self;
  539. FProjectView := TBillsProjectView.Create(Self);
  540. // FProjectView.jpDetails.Height := 240;
  541. ProjectName := aShortName;
  542. FBillsData.EnabledUITreeEvt := FProjectView.ControlBillsTreeRT;
  543. FBillsData.EnabledUIDrawQtyEvt := FProjectView.ControlDrawQtyRT;
  544. FBillsData.DesignCodeEvt := FProjectView.ControlDesignCode;
  545. end;
  546. destructor TProject.Destroy;
  547. begin
  548. FDetailItemsDM.Free;
  549. FRecycleBinData.Free;
  550. FreeAndNil(FArchiver);
  551. { Note:first release UI, and then release database }
  552. FreeAndNil(FProjectView);
  553. FreeAndNil(FBillsData);
  554. FreeAndNil(FDMHisPoint);
  555. FreeAndNil(FDMExprs);
  556. FreeAndNil(FProjPropertyDM);
  557. FreeAndNil(FReport);
  558. inherited;
  559. end;
  560. function TProject.GatherProject(ANewProject: TProject): Boolean;
  561. var
  562. CacheGatherTree: TCacheGatherTree;
  563. begin
  564. Result := False;
  565. CacheGatherTree := TCacheGatherTree.Create;
  566. IncProgressUI(15);
  567. try
  568. if CacheGatherTree.TraverseDBIntoSelf(Self) then
  569. begin
  570. IncProgressUI(35);
  571. CacheGatherTree.TraverseOwnerIntoDB(ANewProject);
  572. IncProgressUI(45);
  573. Result := True;
  574. end;
  575. finally
  576. CacheGatherTree.Free;
  577. end;
  578. end;
  579. procedure TProject.ImportExcelFile(const aFileName: string);
  580. var
  581. exImportor: TExcelImportor;
  582. begin
  583. exImportor := TExcelImportor.Create(FBillsData, aFileName);
  584. // Added by GiLi 2012-4-18 15:02:01
  585. // 使用新的进度条
  586. CreateProgressForm(100, '正在导入Excel清单文件>>>');
  587. try
  588. exImportor.ImportExcel;
  589. FDetailItemsDM.PQEmptyDetail;
  590. finally
  591. exImportor.Free;
  592. CloseFloatProgress;
  593. IncProgressUI(100);
  594. end;
  595. end;
  596. procedure TProject.InnerSave;
  597. begin
  598. FBillsData.Save;
  599. FDMExprs.Save;
  600. FRecycleBinData.Save;
  601. // FDMHisPoint.Save;
  602. end;
  603. function TProject.NeedSaveDatabase: Boolean;
  604. begin
  605. Result := (FBillsData.ShouldSave or FChanged) and (not FForceUndoSave);
  606. end;
  607. procedure TProject.Save;
  608. begin
  609. IncProgressUI(5);
  610. InnerSave;
  611. IncProgressUI(60);
  612. FArchiver.Save;
  613. IncProgressUI(35);
  614. FChanged := False;
  615. end;
  616. function TProject.NewFile(const aFileName, TempleteFile: string; var aNewName: string): Boolean;
  617. var
  618. strTemPath: string;
  619. begin
  620. strTemPath := Format('%s\Data\%s', [ExtractFileDir(ParamStr(0)), TempleteFile]);
  621. aNewName := Format('%s\我的清单\%s.smb', [ExtractFileDir(ParamStr(0)), aFileName]);
  622. Result := CopyFile(PChar(strTemPath), PChar(aNewName), True);
  623. end;
  624. procedure TProject.Save(const aCreatePoint: Boolean; aFixed: Boolean);
  625. begin
  626. Save;
  627. if aCreatePoint then FDMHisPoint.SavePoint(aFixed);
  628. FArchiver.Save;
  629. end;
  630. procedure TProject.SaveAs(const FileName: string);
  631. begin
  632. IncProgressUI(5);
  633. InnerSave;
  634. IncProgressUI(60);
  635. FArchiver.SaveTo(FileName);
  636. IncProgressUI(35);
  637. end;
  638. procedure TProject.SetStdBillsCtrl(const Value: TObject);
  639. begin
  640. FStdBillsCtrl := Value;
  641. FBillsData.StdBillsCtrl := FStdBillsCtrl;
  642. FProjectView.StdBillsCtrl := FStdBillsCtrl;
  643. end;
  644. function TProject.GetProjectType: Integer;
  645. begin
  646. Result := FProjPropertyDM.GetProjectType;
  647. end;
  648. procedure TProject.SetProjectName(const Value: string);
  649. begin
  650. FProjectName := Value;
  651. FDMHisPoint.ProjectName := FProjectName;
  652. end;
  653. procedure TProject.ImportQtyItems(const aFileName: string);
  654. var
  655. exImportor: TExcelImportor;
  656. begin
  657. exImportor := TExcelImportor.Create(FBillsData, aFileName);
  658. try
  659. exImportor.ImportQtyItems;
  660. finally
  661. exImportor.Free;
  662. end;
  663. end;
  664. procedure TProject.ExportExcel(aProjMgr: TObject; const aFileName: string; aStrings: TStrings; aFlag: Integer);
  665. var
  666. eeExportor: TExcelExportor;
  667. begin
  668. eeExportor := TExcelExportor.Create(FBillsData, aProjMgr);
  669. try
  670. eeExportor.ExportToExcel(aFileName, aStrings, aFlag);
  671. finally
  672. eeExportor.Free;
  673. end;
  674. end;
  675. function TProject.GetConnection: TADOConnection;
  676. begin
  677. Result := FArchiver.Connection;
  678. end;
  679. function TProject.GetGatherID: Integer;
  680. begin
  681. if FFlag = 3 then
  682. Result := FParentID
  683. else
  684. Result := FID;
  685. end;
  686. procedure TProject.CheckBeforeGather;
  687. begin
  688. if (FID = -1) or (FFlag = 1) then
  689. raise Exception.Create('建设项目或预览项目不能汇总.');
  690. end;
  691. procedure TProject.SetBidLotList(const Value: TStrings);
  692. begin
  693. FProjectView.BidLotList := Value;
  694. end;
  695. procedure TProject.SetFlag(const Value: Integer);
  696. begin
  697. FFlag := Value;
  698. FProjectView.ControlOwnerBid(FFlag);
  699. end;
  700. procedure TProject.InitNewProject;
  701. var
  702. Decorator: TDecorator;
  703. begin
  704. Decorator := TCreateDecorator.Create(FBillsData, {$I ProjectBills.inc});
  705. try
  706. Decorator.Decorate;
  707. finally
  708. Decorator.Free;
  709. end;
  710. end;
  711. // Added by GiLi 2012-3-16 17:18:14
  712. // 重新设置文件的别名
  713. procedure TProject.ResetFileAlias(const sNewAlias: string);
  714. begin
  715. if Assigned(FArchiver) then
  716. begin
  717. FArchiver.Alias := sNewAlias;
  718. FArchiver.Save;
  719. end
  720. else
  721. raise Exception.Create('文件重命名出错!');
  722. end;
  723. procedure TProject.ExportFlatExcel(const AFileName: string);
  724. var
  725. Exportor: TFlatGclExcelExportor;
  726. begin
  727. Exportor := TFlatGclExcelExportor.Create(FBillsData);
  728. try
  729. Exportor.ExportFile(aFileName);
  730. finally
  731. Exportor.Free;
  732. end;
  733. end;
  734. end.