MainFrm.pas 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079
  1. unit MainFrm;
  2. interface
  3. uses
  4. // Uses Units Please Try This Category
  5. // View
  6. ProjectManagerFme, ProjectFme, ProjectPropertiesFrm, OptionFrm, AboutFrm,
  7. AuthFrm,
  8. // Model & Data & Data Control ...
  9. ProjectData, SupportUnit, Globals, ZhAPI, ExcelImport, ConditionalDefines,
  10. // Controls & Delphi Default ... (Almost By Add Controls)
  11. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  12. Dialogs, cxGraphics, JimPages, ComCtrls, dxStatusBar, cxControls, JimTabs,
  13. dxBar, ImgList, UtilMethods, ZjDbaActns, ActnList, XPStyleActnCtrls, ActnMan,
  14. dxBarExtItems, sdDB, ExtCtrls, jpeg, StdCtrls, CslLabel, pngimage;
  15. type
  16. TMainForm = class(TForm)
  17. dxBarManager: TdxBarManager;
  18. Images: TImageList;
  19. dxsiFile: TdxBarSubItem;
  20. jtsProjects: TJimTabSet;
  21. dxStatusBar: TdxStatusBar;
  22. dxStatusBarContainer2: TdxStatusBarContainerControl;
  23. ProgressBar: TProgressBar;
  24. jpsMain: TJimPages;
  25. jpsMainProjectsManager: TJimPage;
  26. jpsMainProjects: TJimPage;
  27. jpsProjects: TJimPages;
  28. dxsiEdit: TdxBarSubItem;
  29. dxsiHelp: TdxBarSubItem;
  30. dxbtnCopy: TdxBarButton;
  31. dxbtnPaste: TdxBarButton;
  32. dxbtnCut: TdxBarButton;
  33. dxbtnInsert: TdxBarButton;
  34. dxbtnDelete: TdxBarButton;
  35. dxbtnUpMove: TdxBarButton;
  36. dxbtnDownMove: TdxBarButton;
  37. dxbtnUpLevel: TdxBarButton;
  38. dxbtnDownLevel: TdxBarButton;
  39. dxbtnAuthorizeDog: TdxBarButton;
  40. dxbtnAbout: TdxBarButton;
  41. dxbtnNewProject: TdxBarButton;
  42. dxbtnOpenProject: TdxBarButton;
  43. dxbtnDeleteProject: TdxBarButton;
  44. ActionManager1: TActionManager;
  45. ZjDbaInsert: TZjDbaInsert;
  46. ZjDbaDelete: TZjDbaDelete;
  47. ZjDbaUpMove: TZjDbaUpMove;
  48. ZjDbaDownMove: TZjDbaDownMove;
  49. ZjTreeDbaUpLevel: TZjTreeDbaUpLevel;
  50. ZjTreeDbaDownLevel: TZjTreeDbaDownLevel;
  51. ZjGridCopy: TZjGridCopy;
  52. ZjGridPaste: TZjGridPaste;
  53. ZjGridCut: TZjGridCut;
  54. ZjGridRemapedPaste: TZjGridRemapedPaste;
  55. dxpmTabSet: TdxBarPopupMenu;
  56. dxbtnCloseProject: TdxBarButton;
  57. actnCloseProject: TAction;
  58. dxbtnNewPhase: TdxBarButton;
  59. dxbtnCalculateLedger: TdxBarButton;
  60. actnNewPhase: TAction;
  61. dxbtnProjectProperties: TdxBarButton;
  62. actnProjectProperties: TAction;
  63. dxbtnSaveProject: TdxBarButton;
  64. actnSaveProject: TAction;
  65. dxbtnRemapedPaste: TdxBarButton;
  66. dxbtnImportExcel: TdxBarButton;
  67. actnImportExcel: TAction;
  68. dxbtnNewAudit: TdxBarButton;
  69. dxbtnCopyBillsBlock: TdxBarButton;
  70. actnNewAudit: TAction;
  71. dxbtnFinalAudit: TdxBarButton;
  72. dxbtnSubmitProject: TdxBarButton;
  73. dxbtnReceiveProject: TdxBarButton;
  74. dxbtnReplyProject: TdxBarButton;
  75. dxbtnAcceptProject: TdxBarButton;
  76. dxbtnCalculateAll: TdxBarButton;
  77. dxbtnNewSubProject: TdxBarButton;
  78. dxbtnNewTender: TdxBarButton;
  79. dxbtnOptions: TdxBarButton;
  80. actnOptions: TAction;
  81. dxbtnCalculatePhasePay: TdxBarButton;
  82. actnSubmit: TAction;
  83. actnReply: TAction;
  84. dxbtnSubmit: TdxBarButton;
  85. dxbtnReply: TdxBarButton;
  86. dxbtnFirstLevel: TdxBarButton;
  87. dxbtnSecondLevel: TdxBarButton;
  88. dxbtnThirdLevel: TdxBarButton;
  89. dxbtnFourthLevel: TdxBarButton;
  90. dxbtnFifthLevel: TdxBarButton;
  91. dxbtnAllLevel: TdxBarButton;
  92. dxbtnAllXmj: TdxBarButton;
  93. dxbtnExportGridToExcel: TdxBarButton;
  94. dxbtnRefresh: TdxBarButton;
  95. dxbtnUnlockInfo: TdxBarButton;
  96. actnUnlockInfo: TAction;
  97. dxUser: TdxBarSubItem;
  98. pnlUser: TPanel;
  99. lblAccount: TLabel;
  100. lblCompany: TLabel;
  101. lblRole: TLabel;
  102. dxLoginCloud: TdxBarButton;
  103. dxManageAccount: TdxBarButton;
  104. pnl1: TPanel;
  105. imgUserImage: TImage;
  106. lblMail: TLabel;
  107. dxUserContainer: TdxBarControlContainerItem;
  108. dxbtnBatchAddChild: TdxBarButton;
  109. dxbtnBatchAddNext: TdxBarButton;
  110. dxbtnReorderChildrenCode: TdxBarButton;
  111. dxbtnImportBillsPrice: TdxBarButton;
  112. dxsiImportExcel: TdxBarSubItem;
  113. dxbtnImportDealBills: TdxBarButton;
  114. actnImportBillsPrice: TAction;
  115. actnImportDealBills: TAction;
  116. dxbtnBatchReplaceBillsInfo: TdxBarButton;
  117. tAutoSave: TTimer;
  118. dxsiExportExcel: TdxBarSubItem;
  119. dxbtnExportExcel: TdxBarButton;
  120. actnExportExcel: TAction;
  121. dxbtnCurPhase: TdxBarButton;
  122. dxSync: TdxBarButton;
  123. dxbtnBatchWritePos_Reason: TdxBarButton;
  124. dxbtnExportCloudTenderFile: TdxBarButton;
  125. actnExportCloudTenderFile: TAction;
  126. dxtbnImportCloudTenderFile: TdxBarButton;
  127. actnImportCloudTenderFile: TAction;
  128. dxbtnCheckAndClear: TdxBarButton;
  129. dxbtnModifyDealBills: TdxBarButton;
  130. dxbtnLocateBills: TdxBarButton;
  131. dxbtnOpenBackupFolder: TdxBarButton;
  132. dxbtnSetBookmark: TdxBarButton;
  133. dxbtnExportFxBillsExcel: TdxBarButton;
  134. actnExportFxBillsExcel: TAction;
  135. dxseBatchInsert: TdxBarSpinEdit;
  136. actnBatchInsert: TAction;
  137. dxbtnRename: TdxBarButton;
  138. dxbtnImportGclBillsToXmj: TdxBarButton;
  139. dxbtnChangeDealBillsMode: TdxBarButton;
  140. dxsiExpandTo: TdxBarSubItem;
  141. dxbtnLocateBookmark: TdxBarButton;
  142. dxbtnImportPlaneFxBillsToXmj: TdxBarButton;
  143. dxbtnAllPeg: TdxBarButton;
  144. dxsiData: TdxBarSubItem;
  145. dxbtnTenderPartition: TdxBarButton;
  146. dxbtnSetDealPayPlan: TdxBarButton;
  147. dxbtnAddDetailGLs: TdxBarButton;
  148. dxbtnCopyDetailGls: TdxBarButton;
  149. dxbtnApplyToSameBills: TdxBarButton;
  150. dxbtnCalculatePriceMargin: TdxBarButton;
  151. dxbtnFxZJJL: TdxBarButton;
  152. dxbtnGclZJJL: TdxBarButton;
  153. dxbtnInsertCol: TdxBarButton;
  154. dxbtnHidden: TdxBarButton;
  155. dxbtnCancelHidden: TdxBarButton;
  156. dxbtnImportDmf: TdxBarButton;
  157. actnImportDmf: TAction;
  158. dxbtnCanCalc: TdxBarButton;
  159. dxbtnWithoutCalcCurPay: TdxBarButton;
  160. dxbtnSignOnline: TdxBarButton;
  161. dxbtnExportTpExcel: TdxBarButton;
  162. dxbtnHelpCenter: TdxBarButton;
  163. dxbtnLocateMeasureBills: TdxBarButton;
  164. dxbtnGuest: TdxBarButton;
  165. dxbtnLocateZJJL: TdxBarButton;
  166. dxbtnEpure: TdxBarButton;
  167. dxbtnLocateCompileBills: TdxBarButton;
  168. dxbtnGclGatherZJJL: TdxBarButton;
  169. dxbtnExportSumBaseFile: TdxBarButton;
  170. actnExportSumBaseFile: TAction;
  171. dxbtnGatherSubTender: TdxBarButton;
  172. dxbtnExportTenderError: TdxBarButton;
  173. dxbtnExportAllError: TdxBarButton;
  174. dxbtnExportStgResultExcel: TdxBarButton;
  175. dxbtnExportStgResult: TdxBarButton;
  176. dxbtnImportSubTenderGather: TdxBarButton;
  177. actnImportSubTenderGather: TAction;
  178. dxbtnExportBillsJson: TdxBarButton;
  179. actnExportBillsJson: TAction;
  180. dxbtnExportBillsPosExcelData: TdxBarButton;
  181. actnExportBillsPosExcelData: TAction;
  182. dxbtnDeleteRow: TdxBarButton;
  183. dxbtnInsertRow: TdxBarButton;
  184. dxsiGatherSub: TdxBarSubItem;
  185. dxbtnGatherSubTenderGcl: TdxBarButton;
  186. dxsiImportSubTenderGather: TdxBarSubItem;
  187. dxbtnImportSubTenderGatherGcl: TdxBarButton;
  188. actnImportSubTenderGatherGcl: TAction;
  189. actnImportSubTenderGatherGclExcel: TAction;
  190. dxbtnImportSubTenderGatherExcel: TdxBarButton;
  191. dxbtnExportStdJson: TdxBarButton;
  192. ilstLarge: TImageList;
  193. ilstSmall: TImageList;
  194. ilstExpend: TImageList;
  195. dxbtnImportPhaseData: TdxBarButton;
  196. actnImportPhaseData: TAction;
  197. dxbtnRepairMainData: TdxBarButton;
  198. actnRepairMainData: TAction;
  199. procedure FormCreate(Sender: TObject);
  200. procedure FormDestroy(Sender: TObject);
  201. procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;
  202. var AllowChange: Boolean);
  203. procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  204. procedure jtsProjectsMouseDown(Sender: TObject; Button: TMouseButton;
  205. Shift: TShiftState; X, Y: Integer);
  206. procedure actnCloseProjectExecute(Sender: TObject);
  207. procedure actnCloseProjectUpdate(Sender: TObject);
  208. procedure actnNewPhaseExecute(Sender: TObject);
  209. procedure actnProjectPropertiesUpdate(Sender: TObject);
  210. procedure actnProjectPropertiesExecute(Sender: TObject);
  211. procedure actnSaveProjectExecute(Sender: TObject);
  212. procedure actnNewAuditExecute(Sender: TObject);
  213. procedure actnNewPhaseUpdate(Sender: TObject);
  214. procedure actnOptionsExecute(Sender: TObject);
  215. procedure actnImportExcelExecute(Sender: TObject);
  216. procedure actnReplyExecute(Sender: TObject);
  217. procedure actnSubmitExecute(Sender: TObject);
  218. procedure dxBarManagerShowToolbarsPopup(Sender: TdxBarManager;
  219. PopupItemLinks: TdxBarItemLinks);
  220. procedure actnSubmitUpdate(Sender: TObject);
  221. procedure actnImportExcelUpdate(Sender: TObject);
  222. procedure actnUnlockInfoUpdate(Sender: TObject);
  223. procedure actnUnlockInfoExecute(Sender: TObject);
  224. procedure dxbtnAboutClick(Sender: TObject);
  225. procedure dxLoginCloudClick(Sender: TObject);
  226. procedure dxManageAccountClick(Sender: TObject);
  227. procedure dxbtnAuthorizeDogClick(Sender: TObject);
  228. procedure actnImportBillsPriceExecute(Sender: TObject);
  229. procedure actnImportDealBillsExecute(Sender: TObject);
  230. procedure tAutoSaveTimer(Sender: TObject);
  231. procedure actnExportExcelExecute(Sender: TObject);
  232. procedure dxSyncClick(Sender: TObject);
  233. procedure actnExportCloudTenderFileExecute(Sender: TObject);
  234. procedure actnExportCloudTenderFileUpdate(Sender: TObject);
  235. procedure actnImportCloudTenderFileExecute(Sender: TObject);
  236. procedure actnImportCloudTenderFileUpdate(Sender: TObject);
  237. procedure actnExportFxBillsExcelExecute(Sender: TObject);
  238. procedure dxseBatchInsertKeyDown(Sender: TObject; var Key: Word;
  239. Shift: TShiftState);
  240. procedure actnReplyUpdate(Sender: TObject);
  241. procedure dxbtnTenderPartitionClick(Sender: TObject);
  242. procedure actnImportDmfExecute(Sender: TObject);
  243. procedure dxbtnHelpCenterClick(Sender: TObject);
  244. procedure actnExportSumBaseFileExecute(Sender: TObject);
  245. procedure dxbtnGatherSubTenderClick(Sender: TObject);
  246. procedure actnImportSubTenderGatherExecute(Sender: TObject);
  247. procedure actnImportSubTenderGatherUpdate(Sender: TObject);
  248. procedure actnExportBillsJsonExecute(Sender: TObject);
  249. procedure actnExportBillsJsonUpdate(Sender: TObject);
  250. procedure actnExportBillsPosExcelDataExecute(Sender: TObject);
  251. procedure dxbtnGatherSubTenderGclClick(Sender: TObject);
  252. procedure actnImportSubTenderGatherGclExecute(Sender: TObject);
  253. procedure actnImportSubTenderGatherGclExcelExecute(Sender: TObject);
  254. procedure actnImportPhaseDataUpdate(Sender: TObject);
  255. procedure actnImportPhaseDataExecute(Sender: TObject);
  256. procedure actnRepairMainDataUpdate(Sender: TObject);
  257. procedure actnRepairMainDataExecute(Sender: TObject);
  258. private
  259. FProjectManagerFrame: TProjectManagerFrame;
  260. FProjectFrames: TList;
  261. procedure UpdateProgressBar(APosition: Integer);
  262. procedure UpdateProgressHint(const AHint: string);
  263. function CreateProjectView(ARec: TsdDataRecord): TProjectFrame;
  264. procedure LocateProjectView(AIndex: Integer);
  265. procedure DeleteProjectView(AIndex: Integer);
  266. procedure ResetProcessView(AIndex: Integer);
  267. procedure ChangeLeftSideGlobalView(AIndex: Integer);
  268. function GetCurProjectFrame: TProjectFrame;
  269. procedure OnError(ASender: TObject; AE: Exception);
  270. procedure ResetAutoSave;
  271. public
  272. procedure UpdateProgress(APos: Integer; const AHint: string);
  273. procedure LocateProject(AProjectID: Integer);
  274. function HasOpened(AProjectID: Integer): Boolean;
  275. function OpenProject(ARec: TsdDataRecord): TProjectFrame;
  276. property CurProjectFrame: TProjectFrame read GetCurProjectFrame;
  277. property ProjectManagerFrame: TProjectManagerFrame read FProjectManagerFrame;
  278. end;
  279. var
  280. MainForm: TMainForm;
  281. implementation
  282. uses
  283. ProjectProperty, ConstUnit, PHPWebDm, Math, ShellAPI,
  284. FindUserFrm, ImportExcelHintFrm, ConfigDoc, ExportExcel,
  285. ProjectCommands, BillsCompileDm, tpMainFrm,
  286. DealBillsExcelImport, ExcelImport_Bills, DetailExcelImport,
  287. stgGatherControl, stgSelectFileFrm, stgGclGatherControl, stgGclSelectFileFrm;
  288. {$R *.dfm}
  289. {$R MeasureIcons.RES}
  290. procedure TMainForm.FormCreate(Sender: TObject);
  291. procedure CreateProjectManagerFrame;
  292. begin
  293. FProjectManagerFrame := TProjectManagerFrame.Create(nil);
  294. AlignControl(FProjectManagerFrame, jpsMainProjectsManager, alClient);
  295. end;
  296. procedure SetHintFont;
  297. begin
  298. if G_IsCloud then
  299. begin
  300. Screen.HintFont.Size := 11;
  301. Screen.HintFont.Name := 'Microsoft YaHei';
  302. end
  303. else
  304. begin
  305. Screen.HintFont.Name := 'SmartSimSun';
  306. Screen.HintFont.Size := 9;
  307. end;
  308. end;
  309. function GetSoftName: string;
  310. begin
  311. if _ModuleType = mtCompile then
  312. Result := '纵横公路工程0号台账软件'
  313. else if _ModuleType = mtAll then
  314. Result := '纵横公路工程结算决算计量一体化软件';
  315. end;
  316. function GetVersionName: string;
  317. begin
  318. Result := '';
  319. if _IsGuangDong then
  320. Result := Result + '广东';
  321. if _ModuleType = mtAll then
  322. begin
  323. if _IsDebugView then
  324. Result := 'Debug'
  325. else if G_IsTest then
  326. Result := '测试'
  327. else if G_IsCloud then
  328. Result := Result + '云'
  329. else if _IsEncrypt then
  330. Result := Result + '专业'
  331. else
  332. Result := Result + '学习';
  333. end;
  334. if Result <> '' then
  335. Result := Result + '版';
  336. end;
  337. procedure InitialForVersions;
  338. var
  339. sPic: string;
  340. begin
  341. if G_IsCloud then
  342. begin
  343. dxbtnNewProject.Visible := ivNever;
  344. dxbtnNewSubProject.Visible := ivNever;
  345. dxbtnReceiveProject.Visible := ivNever;
  346. dxbtnNewPhase.Visible := ivNever;
  347. dxUser.Visible := ivAlways;
  348. dxUser.Caption := PHPWeb.RealName;
  349. lblAccount.Caption := PHPWeb.RealName;
  350. lblMail.Caption := Format('(%s)', [PHPWeb.Account]);
  351. if Trim(PHPWeb.Company) <> '' then
  352. lblCompany.Caption := PHPWeb.Company
  353. else
  354. lblCompany.Caption := '我的单位';
  355. if Trim(PHPWeb.Role) <> '' then
  356. lblRole.Caption := PHPWeb.Role
  357. else
  358. lblRole.Caption := '我的职称';
  359. // 每次登录都下载到本地,再从本地读入显示。以保证图片实时更新。
  360. sPic := PHPWeb.UserPath + '0_' + IntToStr(PHPWeb.UserID) + '.jpg';
  361. if PHPWeb.DownFile(PHPWeb.UserImageURL, sPic) then
  362. if FileExists(sPic) then
  363. imgUserImage.Picture.LoadFromFile(sPic);
  364. end
  365. else
  366. begin
  367. dxUser.Visible := ivNever;
  368. dxbtnReceiveProject.Visible := ivAlways;
  369. end;
  370. MainForm.Caption := GetSoftName + GetVersionName;
  371. end;
  372. begin
  373. CreateProjectManagerFrame;
  374. FProjectFrames := TList.Create;
  375. InitialForVersions;
  376. SetHintFont;
  377. ResetAutoSave;
  378. end;
  379. procedure TMainForm.UpdateProgress(APos: Integer; const AHint: string);
  380. begin
  381. UpdateProgressBar(APos);
  382. UpdateProgressHint(AHint);
  383. Application.ProcessMessages;
  384. end;
  385. procedure TMainForm.UpdateProgressBar(APosition: Integer);
  386. begin
  387. if APosition < ProgressBar.Max then
  388. ProgressBar.Position := APosition
  389. else
  390. ProgressBar.Position := ProgressBar.Min;
  391. end;
  392. procedure TMainForm.UpdateProgressHint(const AHint: string);
  393. begin
  394. dxStatusBar.Panels[0].Text := AHint;
  395. end;
  396. procedure TMainForm.FormDestroy(Sender: TObject);
  397. begin
  398. ClearObjects(FProjectFrames);
  399. FProjectFrames.Free;
  400. FProjectManagerFrame.Free;
  401. if DirectoryExists(GetAppTempPath) then
  402. DeleteFileOrFolder(GetAppTempPath);
  403. end;
  404. function TMainForm.OpenProject(ARec: TsdDataRecord): TProjectFrame;
  405. begin
  406. if not HasOpened(ARec.ValueByName('ID').AsInteger) then
  407. Result := CreateProjectView(ARec)
  408. else
  409. begin
  410. LocateProject(ARec.ValueByName('ID').AsInteger);
  411. Result := CurProjectFrame;
  412. end;
  413. end;
  414. function TMainForm.HasOpened(AProjectID: Integer): Boolean;
  415. begin
  416. Result := OpenProjectManager.ProjectIndex(AProjectID) <> -1;
  417. end;
  418. procedure TMainForm.LocateProject(AProjectID: Integer);
  419. begin
  420. jtsProjects.TabIndex := OpenProjectManager.ProjectIndex(AProjectID) + 1;
  421. if jpsMain.ActivePage <> jpsMainProjects then
  422. jpsMain.ActivePage := jpsMainProjects;
  423. end;
  424. function TMainForm.CreateProjectView(ARec: TsdDataRecord): TProjectFrame;
  425. function CreateNewProjectPage: TJimPage;
  426. begin
  427. Result := TJimPage.Create(jpsProjects);
  428. Result.Pages := jpsProjects;
  429. jpsProjects.ActivePage := Result;
  430. end;
  431. function CreateNewProjectTab(const ATabName: string; APage: TJimPage): Integer;
  432. begin
  433. Result := jtsProjects.Tabs.AddObject(ATabName, APage);
  434. jtsProjects.TabIndex := Result;
  435. end;
  436. function CreateProjectFrame(AProjectData: TProjectData; APage: TJimPage): TProjectFrame;
  437. var
  438. ProjectFrame: TProjectFrame;
  439. begin
  440. //AProjectData.IsGuest := FProjectManagerFrame.IsGuest;
  441. ProjectFrame := TProjectFrame.Create(AProjectData);
  442. FProjectFrames.Add(ProjectFrame);
  443. ProjectFrame.Parent := APage;
  444. ProjectFrame.Align := alClient;
  445. Result := ProjectFrame;
  446. end;
  447. var
  448. jimPage: TJimPage;
  449. begin
  450. jpsMain.ActivePage := jpsMainProjects;
  451. jimPage := CreateNewProjectPage;
  452. CreateNewProjectTab(ARec.ValueByName('Name').AsString, jimPage);
  453. Result := CreateProjectFrame(OpenProjectManager.Open(ARec), jimPage);
  454. ProjectManager.AddOpenTenderBackup(ARec.ValueByName('ID').AsInteger);
  455. end;
  456. procedure TMainForm.jtsProjectsChange(Sender: TObject; NewTab: Integer;
  457. var AllowChange: Boolean);
  458. begin
  459. LocateProjectView(NewTab - 1);
  460. ResetProcessView(NewTab);
  461. end;
  462. procedure TMainForm.LocateProjectView(AIndex: Integer);
  463. begin
  464. if AIndex >= 0 then
  465. begin
  466. jpsMain.ActivePage := jpsMainProjects;
  467. jpsProjects.ActivePage := TJimPage(jtsProjects.Tabs.Objects[AIndex + 1]);
  468. OpenProjectManager.CurProjectIndex := AIndex;
  469. ChangeLeftSideGlobalView(AIndex);
  470. end
  471. else
  472. jpsMain.ActivePage := jpsMainProjectsManager;
  473. end;
  474. procedure TMainForm.ChangeLeftSideGlobalView(AIndex: Integer);
  475. begin
  476. if (AIndex >= 0) and (AIndex < FProjectFrames.Count) then
  477. TProjectFrame(FProjectFrames[AIndex]).ResetAssistantView;
  478. end;
  479. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  480. begin
  481. try
  482. OpenProjectManager.SaveAll;
  483. except
  484. end;
  485. end;
  486. procedure TMainForm.jtsProjectsMouseDown(Sender: TObject;
  487. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  488. begin
  489. if (Button = mbRight) and (jtsProjects.TabIndex > 0) then
  490. dxpmTabSet.PopupFromCursorPos;
  491. end;
  492. procedure TMainForm.actnCloseProjectExecute(Sender: TObject);
  493. begin
  494. OpenProjectManager.CurProjectData.SaveAndCheck;
  495. DeleteProjectView(jtsProjects.TabIndex - 1);
  496. LocateProjectView(jtsProjects.TabIndex - 1);
  497. ResetProcessView(jtsProjects.TabIndex);
  498. end;
  499. procedure TMainForm.actnCloseProjectUpdate(Sender: TObject);
  500. begin
  501. TAction(Sender).Enabled := jtsProjects.Tabs.Count > 1;
  502. end;
  503. procedure TMainForm.DeleteProjectView(AIndex: Integer);
  504. begin
  505. TProjectFrame(FProjectFrames[AIndex]).Free;
  506. FProjectFrames.Delete(AIndex);
  507. OpenProjectManager.Delete(AIndex);
  508. jpsProjects.Pages.Delete(AIndex);
  509. jtsProjects.Tabs.Delete(AIndex + 1);
  510. end;
  511. procedure TMainForm.actnNewPhaseExecute(Sender: TObject);
  512. begin
  513. TProjectFrame(FProjectFrames[jtsProjects.TabIndex - 1]).CreateNewPhase;
  514. end;
  515. procedure TMainForm.actnProjectPropertiesUpdate(Sender: TObject);
  516. begin
  517. TAction(Sender).Enabled := jtsProjects.TabIndex > 0;
  518. end;
  519. procedure TMainForm.actnProjectPropertiesExecute(Sender: TObject);
  520. begin
  521. ModifyProjectProperties(TProjectFrame(FProjectFrames[jtsProjects.TabIndex - 1]));
  522. end;
  523. procedure TMainForm.actnSaveProjectExecute(Sender: TObject);
  524. begin
  525. OpenProjectManager.CurProjectData.SaveAndCheck;
  526. end;
  527. procedure TMainForm.actnNewAuditExecute(Sender: TObject);
  528. begin
  529. TProjectFrame(FProjectFrames[jtsProjects.TabIndex - 1]).CreateNewAudit;
  530. end;
  531. procedure TMainForm.actnNewPhaseUpdate(Sender: TObject);
  532. begin
  533. TAction(Sender).Enabled := (jtsProjects.Tabs.Count > 1) and Assigned(CurProjectFrame);
  534. if TAction(Sender).Enabled then
  535. with CurProjectFrame.ProjectData do
  536. TAction(Sender).Enabled := TAction(Sender).Enabled and (ProjProperties.AuditStatus = -1);
  537. end;
  538. function TMainForm.GetCurProjectFrame: TProjectFrame;
  539. begin
  540. if jtsProjects.TabIndex > 0 then
  541. Result := TProjectFrame(FProjectFrames[jtsProjects.TabIndex - 1])
  542. else
  543. Result := nil;
  544. end;
  545. procedure TMainForm.actnOptionsExecute(Sender: TObject);
  546. begin
  547. ModifiedOptions;
  548. ResetAutoSave;
  549. end;
  550. procedure TMainForm.actnImportExcelExecute(Sender: TObject);
  551. var
  552. sFileName: string;
  553. Importor: Tdei_CustomBills;
  554. bWithLevelCode, bWithoutGclBills: Boolean;
  555. begin
  556. if HintAndImportTypeSelect(bWithLevelCode, bWithoutGclBills) then
  557. begin
  558. if SelectExcelFile(sFileName) then
  559. begin
  560. Importor := Tdei_CustomBills.Create(CurProjectFrame.ProjectData);
  561. try
  562. Importor.ImportFile(sFileName, bWithLevelCode, bWithoutGclBills);
  563. finally
  564. Importor.Free;
  565. end;
  566. end;
  567. end;
  568. end;
  569. procedure TMainForm.ResetProcessView(AIndex: Integer);
  570. begin
  571. dxBarManager.Bars[2].Visible := AIndex > 0;
  572. if G_IsCloud then
  573. dxBarManager.Bars[2].Visible := False;
  574. end;
  575. procedure TMainForm.actnReplyExecute(Sender: TObject); // 批复
  576. begin
  577. if not CurProjectFrame.CheckCanReport then Exit;
  578. Screen.Cursor := crHourGlass;
  579. try
  580. CurProjectFrame.ProjectData.SaveAndCheck;
  581. {$O-}
  582. // 失败后重复一次
  583. if not CurProjectFrame.ProjectData.ReplyProject then
  584. begin
  585. if not CurProjectFrame.ProjectData.ReplyProject then
  586. ErrorMessage('批复项目失败!');
  587. end;
  588. {$O+}
  589. finally
  590. Screen.Cursor := crDefault;
  591. end;
  592. end;
  593. procedure TMainForm.actnSubmitExecute(Sender: TObject); // 上报
  594. begin
  595. if not CurProjectFrame.CheckCanReport then Exit;
  596. Screen.Cursor := crHourGlass;
  597. try
  598. CurProjectFrame.ProjectData.SaveAndCheck;
  599. {$O-}
  600. // 失败后重复一次
  601. if not CurProjectFrame.ProjectData.SubmitProject then
  602. begin
  603. if not CurProjectFrame.ProjectData.SubmitProject then
  604. ErrorMessage('上报项目失败!');
  605. end;
  606. {$O+}
  607. finally
  608. Screen.Cursor := crDefault;
  609. end;
  610. end;
  611. procedure TMainForm.dxBarManagerShowToolbarsPopup(Sender: TdxBarManager;
  612. PopupItemLinks: TdxBarItemLinks);
  613. begin
  614. // 取消菜单栏右键菜单
  615. PopupItemLinks.Clear;
  616. end;
  617. procedure TMainForm.actnSubmitUpdate(Sender: TObject);
  618. begin
  619. with CurProjectFrame.ProjectData do
  620. TAction(Sender).Enabled := (ProjProperties.PhaseCount > 0) and
  621. ((ProjProperties.AuditStatus >= 0) and (ProjProperties.AuditStatus < iMaxStageCount-1));
  622. end;
  623. procedure TMainForm.actnImportExcelUpdate(Sender: TObject);
  624. begin
  625. TAction(Sender).Enabled := (jtsProjects.Tabs.Count > 1) and Assigned(CurProjectFrame);
  626. if TAction(Sender).Enabled then
  627. with CurProjectFrame.ProjectData do
  628. TAction(Sender).Enabled := TAction(Sender).Enabled and (PhaseIndex < 1);
  629. end;
  630. procedure TMainForm.actnUnlockInfoUpdate(Sender: TObject);
  631. begin
  632. TAction(Sender).Enabled := (jtsProjects.Tabs.Count > 1) and Assigned(CurProjectFrame);
  633. end;
  634. procedure TMainForm.actnUnlockInfoExecute(Sender: TObject);
  635. begin
  636. CurProjectFrame.UnLockData;
  637. end;
  638. procedure TMainForm.dxbtnAboutClick(Sender: TObject);
  639. begin
  640. ShowAboutForm;
  641. end;
  642. procedure TMainForm.dxLoginCloudClick(Sender: TObject);
  643. begin
  644. ShellExecute(Application.Handle, nil, PChar(PHPWeb.LoginCloudURL), nil, nil, SW_SHOWNORMAL);
  645. end;
  646. procedure TMainForm.dxManageAccountClick(Sender: TObject);
  647. begin
  648. ShellExecute(Application.Handle, nil, PChar(PHPWeb.PassportURL), nil, nil, SW_SHOWNORMAL);
  649. end;
  650. procedure TMainForm.dxbtnAuthorizeDogClick(Sender: TObject);
  651. begin
  652. Authorize;
  653. end;
  654. procedure TMainForm.actnImportBillsPriceExecute(Sender: TObject);
  655. var
  656. sFileName: string;
  657. Importor: TBillsPriceExcelImport;
  658. begin
  659. if SelectExcelFile(sFileName) then
  660. begin
  661. Importor := TBillsPriceExcelImport.Create(CurProjectFrame.ProjectData);
  662. try
  663. Importor.ImportFile(sFileName);
  664. finally
  665. Importor.Free;
  666. end;
  667. end;
  668. end;
  669. procedure TMainForm.actnImportDealBillsExecute(Sender: TObject);
  670. var
  671. sFileName: string;
  672. Importor: TDealBillsExcelImport;
  673. begin
  674. if SelectExcelFile(sFileName) then
  675. begin
  676. Importor := TDealBillsExcelImport.Create(CurProjectFrame.ProjectData);
  677. try
  678. Importor.ImportFile(sFileName);
  679. finally
  680. Importor.Free;
  681. end;
  682. end;
  683. end;
  684. procedure TMainForm.tAutoSaveTimer(Sender: TObject);
  685. begin
  686. Screen.Cursor := crHourGlass;
  687. try
  688. OpenProjectManager.SaveAll;
  689. finally
  690. screen.Cursor := crDefault;
  691. end;
  692. end;
  693. procedure TMainForm.ResetAutoSave;
  694. begin
  695. with SupportManager.ConfigInfo do
  696. begin
  697. tAutoSave.Interval := AutoSaveInterval * 60 * 1000;
  698. tAutoSave.Enabled := AutoSave;
  699. end;
  700. end;
  701. procedure TMainForm.actnExportExcelExecute(Sender: TObject);
  702. var
  703. sFileName: string;
  704. Exportor: TIDTreeExcelExportor;
  705. begin
  706. if SaveExcelFile(sFileName) then
  707. begin
  708. Exportor := TIDTreeExcelExportor.Create;
  709. try
  710. if SupportManager.ConfigInfo.ExcelWithMis then
  711. Exportor.DefineCol(@ciLedgerWithMis, Length(ciLedgerWithMis))
  712. else
  713. Exportor.DefineCol(@ciLedger, Length(ciLedger));
  714. Exportor.HasLevelCode := True;
  715. Exportor.ExportToFile(CurProjectFrame.ProjectData.BillsCompileData.BillsCompileTree, sFileName);
  716. finally
  717. Exportor.Free;
  718. end;
  719. end;
  720. end;
  721. procedure TMainForm.dxSyncClick(Sender: TObject);
  722. begin
  723. Screen.Cursor := crHourGlass;
  724. try
  725. FProjectManagerFrame.DoBatchReceiveAllOnline;
  726. finally
  727. Screen.Cursor := crDefault;
  728. end;
  729. end;
  730. procedure TMainForm.actnExportCloudTenderFileExecute(Sender: TObject);
  731. var
  732. sFileName: string;
  733. Exportor: TTenderExport;
  734. Rec: TsdDataRecord;
  735. begin
  736. // 导出前先保存
  737. CurProjectFrame.ProjectData.SaveAndCheck;
  738. // 导出云版专用
  739. sFileName := SupportManager.ConfigInfo.OutputPath + CurProjectFrame.ProjectData.ProjectName + '.ctf';
  740. if SaveFile(sFileName, '.ctf') then
  741. begin
  742. if FileExists(sFileName) and not QuestMessage(Format('存在同名文件“%s”,是否替换?', [ExtractFileName(sFileName)])) then
  743. Exit;
  744. Screen.Cursor := crHourGlass;
  745. try
  746. Rec := ProjectManagerFrame.Rec(CurProjectFrame.ProjectData.ProjectID);
  747. Exportor := TTenderExport.Create(Rec, sFileName);
  748. try
  749. Exportor.Execute;
  750. finally
  751. Exportor.Free;
  752. end;
  753. finally
  754. Screen.Cursor := crDefault;
  755. end;
  756. end;
  757. end;
  758. procedure TMainForm.actnExportCloudTenderFileUpdate(Sender: TObject);
  759. begin
  760. // 仅打开的项目可以导出云版专用格式,且该项目没有进行计量
  761. TAction(Sender).Enabled := (jtsProjects.Tabs.Count > 1) and Assigned(CurProjectFrame);
  762. if TAction(Sender).Enabled then
  763. TAction(Sender).Enabled := CurProjectFrame.ProjectData.ProjProperties.PhaseCount = 0;
  764. end;
  765. procedure TMainForm.actnImportCloudTenderFileExecute(Sender: TObject);
  766. var
  767. sFileName: string;
  768. begin
  769. if SelectFile(sFileName, '.ctf') then
  770. begin
  771. CurProjectFrame.ProjectData.ImportCloudTenderFile(sFileName);
  772. CurProjectFrame.RefreshColumnDisplay;
  773. end;
  774. end;
  775. procedure TMainForm.actnImportCloudTenderFileUpdate(Sender: TObject);
  776. begin
  777. TAction(Sender).Enabled := (jtsProjects.Tabs.Count > 1) and Assigned(CurProjectFrame);
  778. if TAction(Sender).Enabled then
  779. TAction(Sender).Enabled := CurProjectFrame.ProjectData.ProjProperties.PhaseCount = 0;
  780. end;
  781. procedure TMainForm.actnExportFxBillsExcelExecute(Sender: TObject);
  782. var
  783. sFileName: string;
  784. Exportor: TIDTreeExcelExportor;
  785. begin
  786. if SaveExcelFile(sFileName) then
  787. begin
  788. Exportor := TIDTreeExcelExportor.Create;
  789. try
  790. if SupportManager.ConfigInfo.ExcelWithMis then
  791. Exportor.DefineCol(@ciFxBillsWithMis, Length(ciFxBillsWithMis))
  792. else
  793. Exportor.DefineCol(@ciFxBills, Length(ciFxBills));
  794. Exportor.ExportToFile(CurProjectFrame.ProjectData.BillsCompileData.BillsCompileTree, sFileName);
  795. finally
  796. Exportor.Free;
  797. end;
  798. end;
  799. end;
  800. procedure TMainForm.dxseBatchInsertKeyDown(Sender: TObject; var Key: Word;
  801. Shift: TShiftState);
  802. var
  803. i: Integer;
  804. begin
  805. if Key = 13 then
  806. begin
  807. for i := 1 to dxseBatchInsert.IntValue do
  808. ZjDbaInsert.ExecuteTarget(CurProjectFrame.BillsCompileFrame.zgBillsCompile);
  809. end;
  810. end;
  811. procedure TMainForm.actnReplyUpdate(Sender: TObject);
  812. begin
  813. with CurProjectFrame.ProjectData do
  814. TAction(Sender).Enabled := (ProjProperties.PhaseCount > 0);
  815. end;
  816. procedure TMainForm.dxbtnTenderPartitionClick(Sender: TObject);
  817. begin
  818. PartTendersModel;
  819. end;
  820. procedure TMainForm.actnImportDmfExecute(Sender: TObject);
  821. var
  822. sFileName: string;
  823. begin
  824. if SelectFile(sFileName, '.dmf') then
  825. CurProjectFrame.ProjectData.ImportDmfFile(sFileName);
  826. end;
  827. procedure TMainForm.dxbtnHelpCenterClick(Sender: TObject);
  828. const
  829. sHelpUrl = 'http://help.smartcost.com.cn/hc/';
  830. begin
  831. ShellExecute(Application.Handle, nil, PChar(sHelpUrl), nil, nil, SW_SHOWNORMAL);
  832. end;
  833. procedure TMainForm.OnError(ASender: TObject; AE: Exception);
  834. begin
  835. MeasureLog.AppendLogTo(AE.Message);
  836. end;
  837. procedure TMainForm.actnExportSumBaseFileExecute(Sender: TObject);
  838. var
  839. sFileName: string;
  840. Exportor: TTenderExport;
  841. Rec: TsdDataRecord;
  842. begin
  843. // 导出前先保存
  844. CurProjectFrame.ProjectData.SaveAndCheck;
  845. // 导出云版专用
  846. sFileName := SupportManager.ConfigInfo.OutputPath + CurProjectFrame.ProjectData.ProjectName + '.sbf';
  847. if SaveFile(sFileName, '.sbf') then
  848. begin
  849. if FileExists(sFileName) and not QuestMessage(Format('存在同名文件“%s”,是否替换?', [ExtractFileName(sFileName)])) then
  850. Exit;
  851. Screen.Cursor := crHourGlass;
  852. try
  853. Rec := ProjectManagerFrame.Rec(CurProjectFrame.ProjectData.ProjectID);
  854. Exportor := TTenderExport.Create(Rec, sFileName);
  855. try
  856. Exportor.Execute;
  857. finally
  858. Exportor.Free;
  859. end;
  860. finally
  861. Screen.Cursor := crDefault;
  862. end;
  863. end;
  864. end;
  865. procedure TMainForm.dxbtnGatherSubTenderClick(Sender: TObject);
  866. var
  867. gc: TstgGatherControl;
  868. begin
  869. gc := TstgGatherControl.Create;
  870. Screen.Cursor := crHourGlass;
  871. try
  872. if SelectFileForSubTenderGather(gc) then
  873. gc.Gather;
  874. finally
  875. gc.Free;
  876. Screen.Cursor := crDefault;
  877. end;
  878. end;
  879. procedure TMainForm.actnImportSubTenderGatherExecute(Sender: TObject);
  880. var
  881. sFileName: string;
  882. begin
  883. if CurProjectFrame.ProjectData.ProjProperties.PhaseCount = 0 then
  884. WarningMessage('未开始计量,请在开始计量后再导入分包汇总数据。')
  885. else if CurProjectFrame.ProjectData.StageDataReadOnly then
  886. WarningMessage('当前正在查看数据非最新数据,请切换至最新一期再导入分包汇总数据。')
  887. else if QuestMessage('导入将清空标段本期所有计量数据(合同计量),确定继续?') and SelectFile(sFileName, '.sgf') then
  888. CurProjectFrame.ProjectData.ImportSubTenderGather(sFileName);
  889. end;
  890. procedure TMainForm.actnImportSubTenderGatherUpdate(Sender: TObject);
  891. begin
  892. TAction(Sender).Enabled := (jtsProjects.Tabs.Count > 1) and Assigned(CurProjectFrame)
  893. and (CurProjectFrame.ProjectData.PhaseData.StageCount <= 1);
  894. end;
  895. procedure TMainForm.actnExportBillsJsonExecute(Sender: TObject);
  896. var
  897. sFileName: string;
  898. begin
  899. if SaveFile(sFileName, '.json') then
  900. CurProjectFrame.ProjectData.BillsCompileData.RecursiveExportBillsJson(sFileName);
  901. end;
  902. procedure TMainForm.actnExportBillsJsonUpdate(Sender: TObject);
  903. begin
  904. TAction(Sender).Visible := True;//_IsDebugView;
  905. TAction(Sender).Enabled := jtsProjects.Tabs.Count > 1;
  906. end;
  907. procedure TMainForm.actnExportBillsPosExcelDataExecute(Sender: TObject);
  908. var
  909. sFileName: string;
  910. Exportor: TBillsPosExcelExportor;
  911. begin
  912. if SaveExcelFile(sFileName) then
  913. begin
  914. Exportor := TBillsPosExcelExportor.Create;
  915. try
  916. Exportor.ExportToFile(CurProjectFrame.ProjectData.BillsCompileData.BillsCompileTree, sFileName);
  917. finally
  918. Exportor.Free;
  919. end;
  920. end;
  921. end;
  922. procedure TMainForm.dxbtnGatherSubTenderGclClick(Sender: TObject);
  923. var
  924. gc: TstgGclGatherControl;
  925. begin
  926. gc := TstgGclGatherControl.Create;
  927. Screen.Cursor := crHourGlass;
  928. try
  929. if SelectFileForSubTenderGclGather(gc) then
  930. gc.Gather;
  931. finally
  932. gc.Free;
  933. Screen.Cursor := crDefault;
  934. end;
  935. end;
  936. procedure TMainForm.actnImportSubTenderGatherGclExecute(Sender: TObject);
  937. var
  938. sFileName: string;
  939. begin
  940. if CurProjectFrame.ProjectData.ProjProperties.PhaseCount = 0 then
  941. WarningMessage('未开始计量,请在开始计量后再导入分包汇总数据。')
  942. else if CurProjectFrame.ProjectData.StageDataReadOnly then
  943. WarningMessage('当前正在查看数据非最新数据,请切换至最新一期再导入分包汇总数据。')
  944. else if QuestMessage('导入将清空标段本期所有计量数据(合同计量),确定继续?') and SelectFile(sFileName, '.sgfg') then
  945. CurProjectFrame.ProjectData.ImportSubTenderGatherGcl(sFileName);
  946. end;
  947. procedure TMainForm.actnImportSubTenderGatherGclExcelExecute(
  948. Sender: TObject);
  949. var
  950. sFileName: string;
  951. begin
  952. if CurProjectFrame.ProjectData.ProjProperties.PhaseCount = 0 then
  953. WarningMessage('未开始计量,请在开始计量后再导入分包汇总数据。')
  954. else if CurProjectFrame.ProjectData.StageDataReadOnly then
  955. WarningMessage('当前正在查看数据非最新数据,请切换至最新一期再导入分包汇总数据。')
  956. else if QuestMessage('导入将清空标段本期所有计量数据(合同计量),确定继续?') and SelectExcelFile(sFileName) then
  957. CurProjectFrame.ProjectData.ImportSubTenderGatherGclExcel(sFileName);
  958. end;
  959. procedure TMainForm.actnImportPhaseDataUpdate(Sender: TObject);
  960. begin
  961. TAction(Sender).Visible := _IsDebugView;
  962. end;
  963. procedure TMainForm.actnImportPhaseDataExecute(Sender: TObject);
  964. var
  965. sFileName: string;
  966. begin
  967. if QuestMessage('导入计量数据,请确认前后标段一致,并在新增清单前导入,对于本期新增清单,导入数据可能有误,导入后请检查。') and SelectFile(sFileName, 'mtf') then
  968. CurProjectFrame.ProjectData.ImportPhaseData(sFileName);
  969. end;
  970. procedure TMainForm.actnRepairMainDataUpdate(Sender: TObject);
  971. begin
  972. TAction(Sender).Visible := _IsDebugView and Assigned(CurProjectFrame);
  973. end;
  974. procedure TMainForm.actnRepairMainDataExecute(Sender: TObject);
  975. begin
  976. CurProjectFrame.ProjectData.repairMainData;
  977. end;
  978. end.