fraFileManagerFrame.pas 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. unit fraFileManagerFrame;
  2. interface
  3. uses
  4. Classes,
  5. Graphics,
  6. Controls,
  7. Windows,
  8. Forms,
  9. ZjGridDBA,
  10. ActnList,
  11. ExtCtrls,
  12. ZJGrid,
  13. ImgList,
  14. ComCtrls,
  15. ToolWin,
  16. ConstTypeUnit,
  17. Dialogs,
  18. ProjectFileManager,
  19. Menus,
  20. StdCtrls,
  21. Types,
  22. JimLabels,
  23. ZJEdits,
  24. ZjCells,
  25. cxControls,
  26. cxContainer,
  27. cxEdit,
  28. cxTextEdit,
  29. cxMaskEdit,
  30. cxDropDownEdit,
  31. cxCalendar;
  32. type
  33. TFileManagerFrame = class(TFrame)
  34. ToolBar1: TToolBar;
  35. ToolButton1: TToolButton;
  36. ToolButton2: TToolButton;
  37. ToolButton3: TToolButton;
  38. ToolButton4: TToolButton;
  39. ToolButton5: TToolButton;
  40. ilstProject: TImageList;
  41. Actions: TActionList;
  42. actnNewProject: TAction;
  43. actnOpenProject: TAction;
  44. actnDeleteProject: TAction;
  45. actnImportProject: TAction;
  46. actnExportProject: TAction;
  47. ToolButton6: TToolButton;
  48. zaBidLot: TZjGridDBA;
  49. zaGatherBid: TZjGridDBA;
  50. ToolButton7: TToolButton;
  51. ToolButton8: TToolButton;
  52. actnRenameProject: TAction;
  53. zaGatherBidLot: TZjGridDBA;
  54. PopupMenu: TPopupMenu;
  55. N1: TMenuItem;
  56. N2: TMenuItem;
  57. N3: TMenuItem;
  58. N4: TMenuItem;
  59. N5: TMenuItem;
  60. N8: TMenuItem;
  61. N9: TMenuItem;
  62. pnlBidLot: TPanel;
  63. Panel2: TPanel;
  64. zgProperties: TZJGrid;
  65. JimGradLabel4: TJimGradLabel;
  66. pnlBuildProject: TPanel;
  67. zgGatherBid: TZJGrid;
  68. JimGradLabel3: TJimGradLabel;
  69. Splitter1: TSplitter;
  70. Splitter3: TSplitter;
  71. Panel5: TPanel;
  72. zgBidLot: TZJGrid;
  73. JimGradLabel1: TJimGradLabel;
  74. zgGatherBidLot: TZJGrid;
  75. Splitter2: TSplitter;
  76. cxDateEdit: TcxDateEdit;
  77. cxComboBox: TcxComboBox;
  78. tlb1: TToolBar;
  79. tlb2: TToolBar;
  80. tbnNewProject: TToolButton;
  81. tbnOpenProject: TToolButton;
  82. tbnDeleteProject: TToolButton;
  83. tbnImportProject: TToolButton;
  84. tbnExportProject: TToolButton;
  85. tbnRenameProject: TToolButton;
  86. tbnNewSection: TToolButton;
  87. tbnOpenProject1: TToolButton;
  88. tbnDeleteProject1: TToolButton;
  89. tbnImportProject1: TToolButton;
  90. tbnExportProject1: TToolButton;
  91. tbnRenameProject1: TToolButton;
  92. JimGradLabel2: TJimGradLabel;
  93. tlb3: TToolBar;
  94. tbnOpenProject2: TToolButton;
  95. tbnDeleteProject2: TToolButton;
  96. tbnImportProject2: TToolButton;
  97. tbnExportProject2: TToolButton;
  98. tbnRenameProject2: TToolButton;
  99. pmBidLot: TPopupMenu;
  100. actNewSection: TAction;
  101. actDeleteSection: TAction;
  102. N6: TMenuItem;
  103. N7: TMenuItem;
  104. N10: TMenuItem;
  105. N11: TMenuItem;
  106. N12: TMenuItem;
  107. N13: TMenuItem;
  108. pmGather: TPopupMenu;
  109. actDeleteGatherBills: TAction;
  110. actRenameSection: TAction;
  111. Nopen: TMenuItem;
  112. N14: TMenuItem;
  113. N15: TMenuItem;
  114. N16: TMenuItem;
  115. N17: TMenuItem;
  116. actReNameGather: TAction;
  117. procedure actnNewProjectExecute(Sender: TObject);
  118. procedure actnOpenProjectExecute(Sender: TObject);
  119. procedure actnDeleteProjectExecute(Sender: TObject);
  120. procedure zgGatherBidMouseDown(Sender: TObject; Button: TMouseButton;
  121. Shift: TShiftState; X, Y: Integer);
  122. procedure actnRenameProjectExecute(Sender: TObject);
  123. procedure actnImportProjectExecute(Sender: TObject);
  124. procedure actnExportProjectExecute(Sender: TObject);
  125. procedure zgPropertiesCellTextChanged(Sender: TObject; Col,
  126. Row: Integer);
  127. procedure zgPropertiesGetCellEditor(Sender: TObject; ACoord: TPoint;
  128. var AControl: TWinControl);
  129. procedure zgPropertiesEditorSaveCell(Sender: TObject; ACoord: TPoint;
  130. AControl: TWinControl);
  131. procedure zgPropertiesEditorLoadCell(Sender: TObject; ACoord: TPoint;
  132. AControl: TWinControl);
  133. procedure actNewSectionExecute(Sender: TObject);
  134. procedure actDeleteSectionExecute(Sender: TObject);
  135. procedure actDeleteGatherBillsExecute(Sender: TObject);
  136. procedure actRenameSectionExecute(Sender: TObject);
  137. procedure actReNameGatherExecute(Sender: TObject);
  138. private
  139. { Private declarations }
  140. FProjectFileMgr: TProjectFileMgr;
  141. FThreadList: TThreadList;
  142. function GetProjKind: Integer;
  143. procedure WaitThreadOver;
  144. function IsWaitOver: Boolean;
  145. procedure InitProperties;
  146. procedure RefreshProjectProperties(AProjKind: Integer);
  147. procedure SaveProjectProperties;
  148. procedure SetProjectFileMgr(const Value: TProjectFileMgr);
  149. public
  150. { Public declarations }
  151. constructor Create(AOwner: TComponent); override;
  152. destructor Destroy; override;
  153. procedure BeginUpdate;
  154. procedure EndUpdate;
  155. property ProjectFileMgr: TProjectFileMgr read FProjectFileMgr write SetProjectFileMgr;
  156. end;
  157. implementation
  158. {$R *.dfm}
  159. uses
  160. NewProjectFrm,
  161. ConstMethodUnit,
  162. SysUtils,
  163. ConstVarUnit,
  164. ProjectPropertyThread,
  165. MainForm,
  166. ProjectPropertyUnit;
  167. procedure TFileManagerFrame.actnNewProjectExecute(Sender: TObject);
  168. var
  169. strName: string;
  170. ProjList: TStrings;
  171. iProjectType, iProjKind, iGatherID: Integer;
  172. begin
  173. iProjectType := 5;
  174. iProjKind := 1 ;
  175. if ScInputQuery('新建建设项目', '请输入建设项目名称', strName, False) then
  176. begin
  177. FProjectFileMgr.CreateNewProjectOpen(strName, iProjectType, iProjKind);
  178. RefreshProjectProperties(iProjKind);
  179. end;
  180. if MainFrm.ProjectManager.ActiveProject = nil then
  181. begin
  182. if (iProjectType = 5) and (iProjKind = 1) then
  183. zgGatherBid.SetFocus;
  184. end
  185. else
  186. begin
  187. if (iProjectType = 5) and (iProjKind = 1) and (MainFrm.ProjectManager.ActiveProject.ProjectView = nil) then
  188. zgGatherBid.SetFocus;
  189. end;
  190. MainFrm.jpManager.ActivePageIndex := 1;
  191. // MainFrm.SetCaption(jtsBillsProjects.Tabs[0]);
  192. //MainFrm.jtsBillsProjects
  193. {$IFDEF _beOnLine}
  194. MainFrm.Caption := SoftWareName_OnLine + ' - [' + MainFrm.jtsBillsProjects.Tabs[0] + ']';
  195. {$ELSE}
  196. {$IFDEF _beCommon}
  197. MainFrm.Caption := SoftWareName_ZY_Common + ' - [' + MainFrm.jtsBillsProjects.Tabs[0] + ']';
  198. {$ELSE}
  199. {$IFDEF _beEncrypt}
  200. MainFrm.Caption := SoftWareName_ZY + ' - [' + MainFrm.jtsBillsProjects.Tabs[0] + ']';
  201. {$ELSE}
  202. MainFrm.Caption := SoftWareName_XX + ' - [' + MainFrm.jtsBillsProjects.Tabs[0] + ']';
  203. {$ENDIF}
  204. {$ENDIF}
  205. {$ENDIF}
  206. zgGatherBid.SetFocus;
  207. end;
  208. procedure TFileManagerFrame.SetProjectFileMgr(
  209. const Value: TProjectFileMgr);
  210. begin
  211. FProjectFileMgr := Value;
  212. if Assigned(FProjectFileMgr) then
  213. begin
  214. zaGatherBid.DataSet := FProjectFileMgr.GatherProjectDS;
  215. zaBidLot.DataSet := FProjectFileMgr.BidLotProjectDS;
  216. zaGatherBidLot.DataSet := FProjectFileMgr.GatherBidDS;
  217. end;
  218. end;
  219. procedure TFileManagerFrame.actnOpenProjectExecute(Sender: TObject);
  220. begin
  221. FProjectFileMgr.OpenProject(-1, GetProjKind);
  222. end;
  223. procedure TFileManagerFrame.actnDeleteProjectExecute(Sender: TObject);
  224. begin
  225. if MessageQuest('确定要删除该项目吗? ') then
  226. begin
  227. FProjectFileMgr.DeleteProject(GetProjKind);
  228. RefreshProjectProperties(GetProjKind);
  229. end;
  230. end;
  231. function TFileManagerFrame.GetProjKind: Integer;
  232. begin
  233. if zgGatherBid.Focused then
  234. Result := 1
  235. else if zgBidLot.Focused then
  236. Result := 2
  237. else if zgGatherBidLot.Focused then
  238. Result := 3
  239. else
  240. Result := -1;
  241. end;
  242. procedure TFileManagerFrame.zgGatherBidMouseDown(Sender: TObject;
  243. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  244. begin
  245. if (Button = mbLeft) and (ssDouble in Shift) then
  246. begin
  247. WaitThreadOver;
  248. FProjectFileMgr.OpenProject(-1, GetProjKind);
  249. end
  250. else if Button = mbLeft then
  251. RefreshProjectProperties(GetProjKind);
  252. end;
  253. procedure TFileManagerFrame.actnRenameProjectExecute(Sender: TObject);
  254. var
  255. sOldProjName: string;
  256. sNewProjName: string;
  257. begin
  258. sOldProjName := FProjectFileMgr.GetProjectName(GetProjKind);
  259. sNewProjName := sOldProjName;
  260. while ScInputQuery('重命名', '新项目名称', sNewProjName) do
  261. begin
  262. if not CheckSpecialChar(sNewProjName) then
  263. begin
  264. FProjectFileMgr.RenameProject(GetProjKind, sNewProjName);
  265. Break;
  266. end
  267. else
  268. begin
  269. sNewProjName := sOldProjName;
  270. MessageWarning(Screen.ActiveForm.Handle, sSpecialChar);
  271. end;
  272. end;
  273. end;
  274. procedure TFileManagerFrame.actnImportProjectExecute(Sender: TObject);
  275. var
  276. iProjKind: Integer;
  277. strFileName: string;
  278. strShortName: string;
  279. begin
  280. if OpenFileDialog(sImportTip, '.smb', '',
  281. 'SmartCost造价 (*.smb)|*.smb|清单编制 (*.pcf)|*.pcf',
  282. strFileName)
  283. then
  284. begin
  285. BeginUpdate;
  286. try
  287. if ExtractFileExt(strFileName) = '.pcf' then
  288. begin
  289. FProjectFileMgr.ImportProjects(strFileName);
  290. end
  291. else
  292. begin
  293. strShortName := ExtractFileNameWithoutExt(strFileName);
  294. if InputStdLibName(strShortName, iProjKind, ftImportSmb) then
  295. FProjectFileMgr.ImportProject(strShortName, strFileName, iProjKind);
  296. end;
  297. finally
  298. EndUpdate;
  299. end;
  300. end;
  301. end;
  302. // pcf:(project compress file)
  303. procedure TFileManagerFrame.actnExportProjectExecute(Sender: TObject);
  304. var
  305. strFileName: string;
  306. begin
  307. if SaveFileDialog(sExportTip, '.smb', FProjectFileMgr.GetProjectName(GetProjKind),
  308. 'SmartCost造价 (*.smb)|*.smb|清单编制 (*.pcf)|*.pcf',
  309. strFileName)
  310. then
  311. begin
  312. if FileExists(strFileName) then
  313. begin
  314. if MessageQuest('已存在同名文件,是否替换?') then
  315. DeleteFile(strFileName)
  316. else
  317. Exit;
  318. end;
  319. Application.ProcessMessages;
  320. Screen.Cursor := crHourGlass;
  321. try
  322. if ExtractFileExt(strFileName) = '.pcf' then
  323. FProjectFileMgr.ExportProjects(strFileName, GetProjKind)
  324. else
  325. FProjectFileMgr.ExportProject(strFileName, GetProjKind, True);
  326. finally
  327. Screen.Cursor := crDefault;
  328. end;
  329. end;
  330. end;
  331. constructor TFileManagerFrame.Create(AOwner: TComponent);
  332. begin
  333. inherited;
  334. InitProperties;
  335. pnlBuildProject.Width := Round(0.3 * Screen.Width);
  336. pnlBidLot.Width := Round(0.3 * Screen.Width);
  337. FThreadList := TThreadList.Create;
  338. end;
  339. procedure TFileManagerFrame.InitProperties;
  340. var
  341. I: Integer;
  342. begin
  343. zgProperties.TextAligns.Cols[1] := gaCenterLeft;
  344. zgProperties.TextAligns.Cols[0] := gaCenterRight;
  345. zgProperties.Cells[0, 0].Text := '属性名称';
  346. zgProperties.Cells[0, 0].TextAlign := gaCenterCenter;
  347. zgProperties.Cells[1, 0].Text := '属性内容';
  348. zgProperties.Cells[1, 0].TextAlign := gaCenterCenter;
  349. zgProperties.CellClass.Item[1, 1] := TZjComboCell;
  350. zgProperties.CellClass.Item[1, 7] := TZjComboCell;
  351. zgProperties.CellClass.Item[1, 14] := TZjComboCell;
  352. for I := Low(ArrProjectProperties) to High(ArrProjectProperties) do
  353. begin
  354. zgProperties.Cells[0, I + 1].Text := ArrProjectProperties[I] + ':';
  355. end;
  356. end;
  357. procedure TFileManagerFrame.RefreshProjectProperties(AProjKind: Integer);
  358. begin
  359. TProjPtyThread.Create(AProjKind,
  360. zgProperties,
  361. FProjectFileMgr,
  362. True,
  363. FThreadList);
  364. end;
  365. procedure TFileManagerFrame.SaveProjectProperties;
  366. begin
  367. TProjPtyThread.Create(GetProjKind,
  368. zgProperties,
  369. FProjectFileMgr,
  370. False,
  371. FThreadList);
  372. end;
  373. procedure TFileManagerFrame.zgPropertiesCellTextChanged(Sender: TObject;
  374. Col, Row: Integer);
  375. begin
  376. if (Col = 1) and (Row > 0) then
  377. SaveProjectProperties;
  378. end;
  379. procedure TFileManagerFrame.zgPropertiesGetCellEditor(Sender: TObject;
  380. ACoord: TPoint; var AControl: TWinControl);
  381. begin
  382. if ACoord.X = 1 then
  383. begin
  384. if ACoord.Y = 1 then
  385. begin
  386. cxComboBox.Properties.Items.Clear;
  387. cxComboBox.Properties.Items.Add('三级清单预算');
  388. // cxComboBox.Properties.Items.Add('旧版本');
  389. AControl := cxComboBox;
  390. end
  391. else if ACoord.Y = 14 then
  392. begin
  393. cxComboBox.Properties.Items.Clear;
  394. cxComboBox.Properties.Items.Add('高速公路');
  395. cxComboBox.Properties.Items.Add('一级公路');
  396. cxComboBox.Properties.Items.Add('二级公路');
  397. cxComboBox.Properties.Items.Add('三级公路');
  398. AControl := cxComboBox;
  399. end
  400. else if ACoord.Y = 7 then
  401. AControl := cxDateEdit;
  402. end;
  403. end;
  404. procedure TFileManagerFrame.zgPropertiesEditorSaveCell(Sender: TObject;
  405. ACoord: TPoint; AControl: TWinControl);
  406. begin
  407. if ACoord.X = 1 then
  408. begin
  409. if ACoord.Y in [1, 14] then
  410. zgProperties.Cells[ACoord.X, ACoord.Y].Text := cxComboBox.Text
  411. else if ACoord.Y = 7 then
  412. zgProperties.Cells[1, 7].Text := cxDateEdit.Text;
  413. end;
  414. end;
  415. procedure TFileManagerFrame.zgPropertiesEditorLoadCell(Sender: TObject;
  416. ACoord: TPoint; AControl: TWinControl);
  417. begin
  418. if ACoord.X = 1 then
  419. begin
  420. if ACoord.Y in [1, 14] then
  421. cxComboBox.Text := zgProperties.Cells[ACoord.X, ACoord.Y].Text
  422. else if ACoord.Y = 7 then
  423. cxDateEdit.Text := zgProperties.Cells[1, 7].Text;
  424. end;
  425. end;
  426. procedure TFileManagerFrame.WaitThreadOver;
  427. var
  428. iLoop: Integer;
  429. begin
  430. iLoop := 0;
  431. while True do
  432. begin
  433. Inc(iLoop);
  434. Sleep(100);
  435. // 因为线程中有界面同步: Synchronize(WriteToGrid);
  436. // 所以不能让等待一直占着主线程
  437. Application.ProcessMessages;
  438. if IsWaitOver then Break;
  439. if iLoop >= 20 then Break;
  440. end;
  441. end;
  442. destructor TFileManagerFrame.Destroy;
  443. begin
  444. WaitThreadOver;
  445. FThreadList.Free;
  446. inherited;
  447. end;
  448. function TFileManagerFrame.IsWaitOver: Boolean;
  449. var
  450. thrList: TList;
  451. begin
  452. thrList := FThreadList.LockList;
  453. try
  454. Result := thrList.Count <= 0;
  455. finally
  456. FThreadList.UnlockList;
  457. end;
  458. end;
  459. procedure TFileManagerFrame.BeginUpdate;
  460. begin
  461. zgGatherBid.BeginUpdate;
  462. zgBidLot.BeginUpdate;
  463. zgGatherBidLot.BeginUpdate;
  464. end;
  465. procedure TFileManagerFrame.EndUpdate;
  466. begin
  467. zgGatherBid.EndUpdate;
  468. zgBidLot.EndUpdate;
  469. zgGatherBidLot.EndUpdate;
  470. end;
  471. procedure TFileManagerFrame.actNewSectionExecute(Sender: TObject);
  472. var
  473. strName: string;
  474. ProjList: TStrings;
  475. iProjectType, iProjKind, iGatherID: Integer;
  476. begin
  477. iProjectType := 5;
  478. ProjList := TStringList.Create;
  479. try
  480. FProjectFileMgr.GetBuildProjectList(ProjList);
  481. if not NewProjectInfo(ProjList, strName,
  482. iProjectType, iProjKind, iGatherID,
  483. FProjectFileMgr.GetBuildProjRecordNo) then Exit;
  484. finally
  485. ProjList.Free;
  486. end;
  487. if iProjKind = 2 then FProjectFileMgr.LocateBuildProject(iGatherID);
  488. FProjectFileMgr.CreateNewProjectOpen(strName, iProjectType, iProjKind);
  489. RefreshProjectProperties(iProjKind);
  490. end;
  491. procedure TFileManagerFrame.actDeleteSectionExecute(Sender: TObject);
  492. begin
  493. if MessageQuest('确定要删除该标段分项清单吗? ') then
  494. begin
  495. FProjectFileMgr.DeleteProject(GetProjKind);
  496. RefreshProjectProperties(GetProjKind);
  497. end;
  498. end;
  499. procedure TFileManagerFrame.actDeleteGatherBillsExecute(Sender: TObject);
  500. begin
  501. if MessageQuest('确定要删除该项目清单吗? ') then
  502. begin
  503. FProjectFileMgr.DeleteProject(GetProjKind);
  504. RefreshProjectProperties(GetProjKind);
  505. end;
  506. end;
  507. procedure TFileManagerFrame.actRenameSectionExecute(Sender: TObject);
  508. var
  509. sOldProjName: string;
  510. sNewProjName: string;
  511. begin
  512. sOldProjName := FProjectFileMgr.GetProjectName(GetProjKind);
  513. sNewProjName := sOldProjName;
  514. while ScInputQuery('重命名', '新标段分项清单名称', sNewProjName) do
  515. begin
  516. if not CheckSpecialChar(sNewProjName) then
  517. begin
  518. FProjectFileMgr.RenameProject(GetProjKind, sNewProjName);
  519. Break;
  520. end
  521. else
  522. begin
  523. sNewProjName := sOldProjName;
  524. MessageWarning(Screen.ActiveForm.Handle, sSpecialChar);
  525. end;
  526. end;
  527. end;
  528. procedure TFileManagerFrame.actReNameGatherExecute(Sender: TObject);
  529. var
  530. sOldProjName: string;
  531. sNewProjName: string;
  532. begin
  533. sOldProjName := FProjectFileMgr.GetProjectName(GetProjKind);
  534. sNewProjName := sOldProjName;
  535. while ScInputQuery('重命名', '新项目清单名称', sNewProjName) do
  536. begin
  537. if not CheckSpecialChar(sNewProjName) then
  538. begin
  539. FProjectFileMgr.RenameProject(GetProjKind, sNewProjName);
  540. Break;
  541. end
  542. else
  543. begin
  544. sNewProjName := sOldProjName;
  545. MessageWarning(Screen.ActiveForm.Handle, sSpecialChar);
  546. end;
  547. end;
  548. end;
  549. end.