BillsProjectFrame.pas 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702
  1. unit BillsProjectFrame;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes,
  5. Graphics, Controls, Forms,
  6. Dialogs, ZjGridTreeDBA, ZjGridDBA, ZJGrid,
  7. ExtCtrls, ComCtrls, ToolWin,
  8. DataBase, StdCtrls, ZJEdits, ZjCells,
  9. ConstMethodUnit, ZjLists, XPMenu, ZjPopupPanel, JimPages,
  10. fraBillsItemsFrame, ImgList, dxBar, GridsEh, DBGridEh,Buttons
  11. {$IFDEF _beEncrypt}
  12. , ScEncryptUnit
  13. {$ENDIF};
  14. type
  15. TColWidth = record
  16. ColIndex: Integer;
  17. ColWidth: Integer;
  18. end;
  19. PColWidth = ^TColWidth;
  20. type
  21. TBillsProjectView = class(TFrame)
  22. zaDrawingQuantity: TZjGridDBA;
  23. zaBills: TZjGridTreeDBA;
  24. xppBillsView: TdxBarPopupMenu;
  25. xppDrawQuantity: TdxBarPopupMenu;
  26. XPMenu: TXPMenu;
  27. zaCustomStep: TZjGridDBA;
  28. zaDQCalcExprs: TZjGridDBA;
  29. dxpmLocateBills: TdxBarPopupMenu;
  30. dxpmShowLevel: TdxBarPopupMenu;
  31. zaQtyItems: TZjGridDBA;
  32. JimPages: TJimPages;
  33. JimPagesPage1: TJimPage;
  34. JimPagesPage2: TJimPage;
  35. jpDetails: TJimPages;
  36. jpDetailsPage1: TJimPage;
  37. Panel1: TPanel;
  38. Splitter3: TSplitter;
  39. zgDrawingQuantity: TZJGrid;
  40. cbDQUnit: TZjComboBox;
  41. zgCustomStep: TZJGrid;
  42. jpDetailsPage2: TJimPage;
  43. pnlFXQD_Btm: TPanel;
  44. tbViewdQ: TToolBar;
  45. tbDrawingQuantity: TToolButton;
  46. tbItems: TToolButton;
  47. Splitter1: TSplitter;
  48. zgBills: TZJGrid;
  49. cbUnits: TZjComboBox;
  50. pnlFXQD_Top: TPanel;
  51. tbView1: TToolBar;
  52. tbBillsLocate: TToolButton;
  53. tbBillsShowLevel: TToolButton;
  54. QtyItemsFrame: TBillsItemsFrame;
  55. zgQtyItems: TZJGrid;
  56. ToolBar1: TToolBar;
  57. tbtnRefreshBills: TToolButton;
  58. Splitter2: TSplitter;
  59. JimPagesPage3: TJimPage;
  60. zgProjectBills: TZJGrid;
  61. PPItemsFrame: TBillsItemsFrame;
  62. ztaProjectBills: TZjGridTreeDBA;
  63. Panel2: TPanel;
  64. cbAutoSelectItems: TCheckBox;
  65. cbSpanLevelSelItems: TCheckBox;
  66. Splitter4: TSplitter;
  67. zcbBidLot: TZjComboBox;
  68. ToolBar2: TToolBar;
  69. tbAutoSelectNode: TToolButton;
  70. dpmGather: TdxBarPopupMenu;
  71. tbCancelSelectNode: TToolButton;
  72. dpmQtyBills: TdxBarPopupMenu;
  73. jpDetailsPage3: TJimPage;
  74. gStat: TDBGridEh;
  75. btnStat: TToolButton;
  76. btnOneKeyGatherNode: TSpeedButton;
  77. procedure zaBillsGridGetCellEditor(Sender: TObject; ACoord: TPoint;
  78. var AControl: TWinControl);
  79. procedure zaDrawingQuantityGridGetCellEditor(Sender: TObject;
  80. ACoord: TPoint; var AControl: TWinControl);
  81. procedure zgBillsMouseDown(Sender: TObject; Button: TMouseButton;
  82. Shift: TShiftState; X, Y: Integer);
  83. procedure tbDrawingQuantityClick(Sender: TObject);
  84. procedure zgBillsCopy(Sender: TObject; const ABounds: TRect;
  85. var Allow: Boolean);
  86. procedure zgBillsPaste(Sender: TObject; const ABounds: TRect;
  87. var Allow: Boolean);
  88. procedure zgDrawingQuantityMouseDown(Sender: TObject;
  89. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  90. procedure zgCustomStepCellTextChanging(Sender: TObject;
  91. const ACoord: TPoint; var NewValue: String; var Accept: Boolean);
  92. procedure zgBillsCellTextChanging(Sender: TObject;
  93. const ACoord: TPoint; var NewValue: String; var Accept: Boolean);
  94. procedure zgBillsColWidthChange(Sender: TObject; AIndex: Integer;
  95. const AValue: Integer);
  96. procedure tbBillsShowLevelClick(Sender: TObject);
  97. procedure tbBillsLocateClick(Sender: TObject);
  98. procedure cbSpanLevelSelItemsClick(Sender: TObject);
  99. procedure cbAutoSelectItemsClick(Sender: TObject);
  100. procedure tbtnRefreshBillsClick(Sender: TObject);
  101. procedure PPItemsFramezgItemsMouseDown(Sender: TObject;
  102. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  103. procedure ztaProjectBillsGridGetCellText(Sender: TObject;
  104. const ACoord: TPoint; var Value: String);
  105. procedure ztaProjectBillsGridSetCellText(Sender: TObject;
  106. const ACoord: TPoint; var Value: String);
  107. procedure zgProjectBillsCellGetColor(Sender: TObject; ACoord: TPoint;
  108. var AColor: TColor);
  109. procedure zgBillsCellGetColor(Sender: TObject; ACoord: TPoint;
  110. var AColor: TColor);
  111. procedure zgBillsBeforePaste(Sender: TObject; const ABounds: TRect;
  112. var Allow: Boolean);
  113. procedure zgBillsCustomPaste(Sender: TObject; ABounds: TRect;
  114. ASourSheet: TZjSheet);
  115. procedure zgProjectBillsMouseDown(Sender: TObject;
  116. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  117. procedure tbAutoSelectNodeClick(Sender: TObject);
  118. procedure tbCancelSelectNodeClick(Sender: TObject);
  119. procedure QtyItemsFramezgItemsMouseDown(Sender: TObject;
  120. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  121. procedure zgDrawingQuantityShowHint(var HintStr: String;
  122. var CanShow: Boolean; var HintInfo: THintInfo; const ACoord: TPoint);
  123. procedure zaBillsGridSetCellText(Sender: TObject; const ACoord: TPoint;
  124. var Value: String);
  125. procedure zgBillsShowHint(var HintStr: String; var CanShow: Boolean;
  126. var HintInfo: THintInfo; const ACoord: TPoint);
  127. procedure btnOneKeyGatherNodeClick(Sender: TObject);
  128. private
  129. FShowOwnerName: Boolean;
  130. FProject: TObject;
  131. FCreating: Boolean;
  132. FStdBillsCtrl: TObject;
  133. PList: TList;
  134. FIsGradeView: Boolean;
  135. procedure SetUnitsList(AStrings: TStrings);
  136. function GetAutoSelectItems: Boolean;
  137. function GetSpanLevelSelectItems: Boolean;
  138. property IsAutoSelectItems: Boolean read GetAutoSelectItems;
  139. property IsSpanLevelSelectItems: Boolean read GetSpanLevelSelectItems;
  140. procedure SetStdBillsCtrl(const Value: TObject);
  141. {inner delete}
  142. function GetSelectionInfo(aStrList: TStringList): Integer;
  143. procedure RepairTreeStructure(var aPreID, aLastID, aParentID: Integer);
  144. procedure InitView;
  145. procedure SyncSelected(aID: Integer; aValue: Boolean);
  146. function GetPastePosition(var aNode: TZjIDTreeNode; var ABillsQty, ADQQty: Boolean): Integer;
  147. function GetActivePage: Integer;
  148. procedure SetActivePage(const Value: Integer);
  149. function GetActiveDetailPage: Integer;
  150. procedure SetActiveDetailpage(const Value: Integer);
  151. function GetBidLotList: TStrings;
  152. procedure SetBidLotList(const Value: TStrings);
  153. procedure SetProject(const Value: TObject);
  154. function GetRBNodeName(AIndex: Integer): string;
  155. procedure SetShowDesignQuantity(const Value: Boolean);
  156. procedure SetShowDrawingCode(const Value: Boolean);
  157. procedure SetShowEconomicMark(const Value: Boolean);
  158. public
  159. procedure AdjustControlsSize;
  160. constructor Create(aProject: TObject);
  161. destructor Destroy; override;
  162. procedure DoOnStat(AFJF: Currency; AYsCount, AQdCount: Integer);
  163. procedure CopyBills;
  164. // Modified by GiLi 2012-6-11 10:14:15
  165. function IsCanCopyBills: Boolean;
  166. function IsCanGridPaste: Boolean;
  167. procedure CopyBillsToRecycleBin;
  168. { delete }
  169. function GetSelection(aStrList: TStringList; var aPreID, aLastID, aParentID: Integer): Integer;
  170. { control grid repaint }
  171. procedure ControlBillsTreeRT(AEnabled: Boolean; AETree: Boolean = True);
  172. procedure ControlDrawQtyRT(AEnabled: Boolean; AETree: Boolean = True);
  173. procedure ControlDesignCode(AEnabled: Boolean; AETree: Boolean = True);
  174. procedure SetGridFocus(aPageIdx: Integer);
  175. { beginupdate }
  176. procedure BeginUpdate;
  177. procedure EndUpdate;
  178. procedure BeginSelect;
  179. procedure EndSelect;
  180. { xmjBills }
  181. procedure EnterXMJBills;
  182. procedure LeaveXMJBills;
  183. procedure ControlXMJTreeView(aEnabled: Boolean; aXMJTree: Boolean = True);
  184. { Refresh }
  185. function CanRefreshQtyItem: Boolean;
  186. { Control OwnerName visible }
  187. procedure ControlOwnerBid(aFlag: Integer);
  188. // 切换到清单评分视图
  189. procedure SwitchBillsGradeView(AGradeView: Boolean);
  190. procedure LoadBillsViewOption;
  191. property UnitsList: TStrings write SetUnitsList;
  192. property BidLotList: TStrings read GetBidLotList write SetBidLotList;
  193. property ActivePage: Integer read GetActivePage write SetActivePage;
  194. property ActiveDetailPage: Integer read GetActiveDetailPage write SetActiveDetailpage;
  195. property Project: TObject read FProject write SetProject;
  196. property StdBillsCtrl: TObject read FStdBillsCtrl write SetStdBillsCtrl;
  197. property IsGradeView: Boolean read FIsGradeView write FIsGradeView;
  198. property ShowDesignQuantity: Boolean write SetShowDesignQuantity;
  199. property ShowEconomicMark: Boolean write SetShowEconomicMark;
  200. property ShowDrawingCode: Boolean write SetShowDrawingCode;
  201. end;
  202. implementation
  203. {$R *.dfm}
  204. uses
  205. ScCopyBills,
  206. ClipBrd,
  207. ZjClipBrd,
  208. ConstVarUnit,
  209. ScStdBillsCtrl,
  210. ScConfig,
  211. ZjIDTree,
  212. DB,
  213. DBClient,
  214. ScBillsTree,
  215. DetailItemsDM,
  216. CheckPosForm,
  217. MainForm,
  218. NewProjectFrm,
  219. ScProjectManager;
  220. { TBillsProjectView }
  221. constructor TBillsProjectView.Create(aProject: TObject);
  222. begin
  223. FCreating := True;
  224. inherited Create(nil);
  225. Project := aProject;
  226. // zgBills.CellClass.Cols[1] := TZjCheckBoxCell;
  227. zgProjectBills.CellClass.Cols[1] := TZjCheckBoxCell;
  228. zgBills.CellClass.Cols[4] := TZjComboCell;
  229. // zgBills.CellClass.Cols[5] := TZjComboCell;
  230. zgDrawingQuantity.CellClass.Cols[3] := TZjComboCell;
  231. { init }
  232. InitView;
  233. FCreating := False;
  234. end;
  235. destructor TBillsProjectView.Destroy;
  236. begin
  237. // FIntegerList.Free;
  238. inherited;
  239. end;
  240. procedure TBillsProjectView.zaBillsGridGetCellEditor(Sender: TObject;
  241. ACoord: TPoint; var AControl: TWinControl);
  242. begin
  243. if ACoord.X = 4 then
  244. AControl := cbUnits
  245. else if FShowOwnerName and (ACoord.X = 5) then
  246. AControl := zcbBidLot;
  247. end;
  248. procedure TBillsProjectView.zaDrawingQuantityGridGetCellEditor(
  249. Sender: TObject; ACoord: TPoint; var AControl: TWinControl);
  250. begin
  251. if ACoord.X = 3 then
  252. AControl := cbDQUnit;
  253. end;
  254. procedure TBillsProjectView.zgBillsMouseDown(Sender: TObject;
  255. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  256. begin
  257. if Button = mbRight then
  258. begin
  259. xppBillsView.PopupFromCursorPos;
  260. end;
  261. end;
  262. procedure TBillsProjectView.tbDrawingQuantityClick(Sender: TObject);
  263. begin
  264. jpDetails.ActivePageIndex := TToolButton(Sender).Tag;
  265. end;
  266. procedure TBillsProjectView.SetUnitsList(AStrings: TStrings);
  267. begin
  268. cbUnits.Items.Assign(AStrings);
  269. cbDQUnit.Items.Assign(AStrings);
  270. end;
  271. procedure TBillsProjectView.zgBillsCopy(Sender: TObject;
  272. const ABounds: TRect; var Allow: Boolean);
  273. var
  274. rOldSel: TRect;
  275. begin
  276. if zgBills.Tag > 0 then
  277. begin
  278. LockWindowUpdate(zgBills.Handle);
  279. // 保存表格的选中状态
  280. rOldSel.TopLeft := TZjGrid(Sender).Selection.Current;
  281. rOldSel.BottomRight := TZJGrid(Sender).Selection.EndSel;
  282. // 阻止Grid对象近一步执行默认的复制操作
  283. Allow := False;
  284. // 打开剪贴板,因为我们要多次向剪贴板复制不同格式的内容
  285. Clipboard.Open;
  286. try
  287. Screen.Cursor := crHourGlass;
  288. // 调用表格默认的剪贴板,保存文本内容到剪贴板
  289. ZjClipboard.CopyToClipboard(TZjGrid(Sender), ABounds);
  290. // 调用TScXMLClipboard将选中的清单按照一定的格式保存到剪贴板,保存的格式名称为CF_Bills
  291. with TScXMLClipboard.Create(TProject(FProject).BillsData) do
  292. try
  293. with TZjGrid(Sender) do
  294. begin
  295. if zgBills.Tag = 1 then
  296. CopyBillsToClipboard(Selection.Bounds.Top - FixedRowCount,
  297. Selection.Bounds.Bottom - FixedRowCount - 1)
  298. else if zgBills.Tag = 2 then
  299. begin
  300. TProject(FProject).RecycleBinData.InsertNode(TProject(FProject).ProjectName, GetRBNodeName(Selection.Bounds.Top - FixedRowCount));
  301. CopyBillsToFile(TProject(FProject).RecycleBinData.GetCurrentFileName, Selection.Bounds.Top - FixedRowCount,
  302. Selection.Bounds.Bottom - FixedRowCount - 1);
  303. end;
  304. end;
  305. finally
  306. Free;
  307. Screen.Cursor := crDefault;
  308. end;
  309. // 恢复表格的选中状态
  310. TZJGrid(Sender).Selection.SelectRow(rOldSel.Top, rOldSel.Bottom);
  311. finally
  312. zgBills.Tag := 0;
  313. Clipboard.Close;
  314. LockWindowUpdate(0);
  315. end;
  316. end;
  317. end;
  318. procedure TBillsProjectView.zgBillsPaste(Sender: TObject;
  319. const ABounds: TRect; var Allow: Boolean);
  320. begin
  321. if Clipboard.HasFormat(CF_Bills) then
  322. begin
  323. Allow := False;
  324. // 建立TScXMLClipboard对象,执行粘贴过程
  325. with TScXMLClipboard.Create(TProject(FProject).BillsData) do
  326. try
  327. PasteBillsFromClipboard(ABounds.Top - TZjGrid(Sender).FixedRowCount);
  328. finally
  329. Free;
  330. end;
  331. end;
  332. end;
  333. procedure TBillsProjectView.CopyBills;
  334. var
  335. iSelTop: Integer;
  336. iSelBottom: Integer;
  337. begin
  338. with zgBills do
  339. begin
  340. Tag := 1;
  341. // 首先将表格的选中状态转变为整行选择
  342. iSelTop := Selection.Current.Y;
  343. iSelBottom := Selection.EndSel.Y;
  344. Selection.SelectRow(iSelTop, iSelBottom);
  345. // 复制到剪贴板
  346. CopyToClipboard(Selection.Bounds);
  347. end;
  348. end;
  349. procedure TBillsProjectView.zgDrawingQuantityMouseDown(Sender: TObject;
  350. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  351. begin
  352. if Button = mbRight then
  353. xppDrawQuantity.PopupFromCursorPos;
  354. end;
  355. function TBillsProjectView.GetAutoSelectItems: Boolean;
  356. begin
  357. Result := cbAutoSelectItems.Checked;
  358. end;
  359. procedure TBillsProjectView.ControlBillsTreeRT(AEnabled, AETree: Boolean);
  360. begin
  361. if AEnabled then
  362. begin
  363. zgBills.EndUpdate;
  364. zaBills.EnableControl;
  365. if AETree then
  366. if Assigned(zaBills.IDTree) then
  367. zaBills.IDTree.EndUpdate(False);
  368. end
  369. else
  370. begin
  371. zgBills.BeginUpdate;
  372. if AETree then
  373. begin
  374. if Assigned(zaBills.IDTree) then
  375. zaBills.IDTree.BeginUpdate(AETree);
  376. zaBills.DisableControl(True);
  377. end
  378. else
  379. zaBills.DisableControl;
  380. end;
  381. end;
  382. procedure TBillsProjectView.SetStdBillsCtrl(const Value: TObject);
  383. begin
  384. FStdBillsCtrl := Value;
  385. if Assigned(Value) then
  386. begin
  387. with TStdBillsCtrl(FStdBillsCtrl) do
  388. zaCustomStep.DataSet := DMStdBillsLib.cdsCustomStepView;
  389. end
  390. else
  391. zaCustomStep.DataSet := nil;
  392. end;
  393. procedure TBillsProjectView.zgCustomStepCellTextChanging(Sender: TObject;
  394. const ACoord: TPoint; var NewValue: String; var Accept: Boolean);
  395. begin
  396. if zaCustomStep.DataSet.RecordCount = 0 then Accept := False;
  397. end;
  398. procedure TBillsProjectView.zgBillsCellTextChanging(Sender: TObject;
  399. const ACoord: TPoint; var NewValue: String; var Accept: Boolean);
  400. begin
  401. if (zaCustomStep.DataSet.RecordCount > 0) and not ScConfigInfo.AllowMfyCode then
  402. begin
  403. if ACoord.X in [1, 2, 4] then Accept := False;
  404. end;
  405. if ACoord.X = 6 then
  406. begin
  407. if TProject(FProject).BillsData.HasGatherQ then
  408. begin
  409. Accept := False;
  410. MessageHint(0, '设计细目被勾选,不允许修改清单工程量。');
  411. end;
  412. end;
  413. end;
  414. procedure TBillsProjectView.zgBillsColWidthChange(Sender: TObject;
  415. AIndex: Integer; const AValue: Integer);
  416. var
  417. I, iIdx: Integer;
  418. begin
  419. if FCreating then Exit;
  420. iIdx := 0;
  421. for I := 0 to zaBills.Columns.Count - 1 do
  422. begin
  423. if zaBills.Columns[I].Visible and (iIdx = AIndex - zgBills.FixedColCount) then
  424. begin
  425. zaBills.Columns[I].Width := AValue;
  426. Break;
  427. end;
  428. if zaBills.Columns[I].Visible then Inc(iIdx);
  429. end;
  430. end;
  431. procedure TBillsProjectView.tbBillsShowLevelClick(Sender: TObject);
  432. var
  433. P: TPoint;
  434. begin
  435. P := tbView1.ClientToScreen(
  436. Point(tbBillsShowLevel.Left, tbBillsShowLevel.Top + tbBillsShowLevel.Height));
  437. dxpmShowLevel.Popup(P.X, P.Y);
  438. end;
  439. procedure TBillsProjectView.tbBillsLocateClick(Sender: TObject);
  440. var
  441. P: TPoint;
  442. sBillsChapters: TStrings;
  443. begin
  444. P := tbView1.ClientToScreen(
  445. Point(tbBillsLocate.Left, tbBillsLocate.Top + tbBillsLocate.Height));
  446. sBillsChapters := TStrings(GetLocateBillsStrings);
  447. TProject(FProject).BillsData.GetChapterNames(sBillsChapters);
  448. dxpmLocateBills.Popup(P.X, P.Y);
  449. end;
  450. procedure TBillsProjectView.BeginUpdate;
  451. begin
  452. zgBills.BeginUpdate;
  453. zgProjectBills.BeginUpdate;
  454. end;
  455. procedure TBillsProjectView.EndUpdate;
  456. begin
  457. zgBills.EndUpdate;
  458. zgProjectBills.EndUpdate;
  459. end;
  460. function TBillsProjectView.GetSelectionInfo(aStrList: TStringList): Integer;
  461. var
  462. iPosition, iRange, iStart: Integer;
  463. vNode: TZjIDTreeNode;
  464. sIDString: string;
  465. iRefCount: Integer;
  466. begin
  467. Result := 0;
  468. iRefCount := 0;
  469. sIDString := '';
  470. with zaBills.IDTree do
  471. begin
  472. iRange := zgBills.Selection.Bottom - zgBills.Selection.Top;
  473. if Selected.MajorIndex >= zgBills.Selection.Top - zgBills.FixedRowCount + 1 then
  474. vNode := Items[zgBills.Selection.Top - zgBills.FixedRowCount]
  475. else
  476. vNode := Selected;
  477. if not Assigned(vNode) then Exit;
  478. aStrList.Add(IntToStr(vNode.ID));
  479. iStart := vNode.MajorIndex;
  480. iPosition := iStart;
  481. while Assigned(vNode) and (vNode.MajorIndex < iStart + iRange) do
  482. begin
  483. if not Assigned(vNode.LastPosterity) then
  484. begin
  485. if TScBillsItem(vNode).IsPreDefine then
  486. begin
  487. Result := 0;
  488. Break;
  489. end;
  490. if sIDString <> '' then
  491. begin
  492. sIDString := Format('%s or ID=%d', [sIDString, vNode.ID]);
  493. Inc(iRefCount);
  494. if iRefCount = 500 then
  495. begin
  496. aStrList.Add(sIDString);
  497. iRefCount := 0;
  498. sIDString := '';
  499. end;
  500. end
  501. else
  502. begin
  503. sIDString := Format('ID=%d', [vNode.ID]);
  504. Inc(iRefCount);
  505. end;
  506. vNode := vNode.NextNode;
  507. Inc(Result);
  508. end
  509. else
  510. begin
  511. iPosition := vNode.LastPosterity.MajorIndex;
  512. while Assigned(vNode) and (vNode.MajorIndex <= iPosition) do
  513. begin
  514. if TScBillsItem(vNode).IsPreDefine then
  515. begin
  516. Result := 0;
  517. vNode := nil;
  518. Break;
  519. end;
  520. if sIDString <> '' then
  521. begin
  522. sIDString := Format('%s or ID=%d', [sIDString, vNode.ID]);
  523. Inc(iRefCount);
  524. if iRefCount = 500 then
  525. begin
  526. aStrList.Add(sIDString);
  527. iRefCount := 0;
  528. sIDString := '';
  529. end;
  530. end
  531. else
  532. begin
  533. sIDString := Format('ID=%d', [vNode.ID]);
  534. Inc(iRefCount);
  535. end;
  536. vNode := vNode.NextNode;
  537. Inc(Result);
  538. end;
  539. end;
  540. end;
  541. if sIDString <> '' then
  542. aStrList.Add(sIDString);
  543. end;
  544. end;
  545. procedure TBillsProjectView.RepairTreeStructure(var aPreID, aLastID,
  546. aParentID: Integer);
  547. var
  548. iRange, iLast: Integer;
  549. nParent, nPreSibling, nCurNode, nLastNode: TZjIDTreeNode;
  550. begin
  551. with zaBills.IDTree do
  552. begin
  553. aPreID := -1;
  554. aLastID := -1;
  555. aParentID := -1;
  556. iRange := zgBills.Selection.Bottom - zgBills.Selection.Top;
  557. if Selected.MajorIndex >= zgBills.Selection.Top - zgBills.FixedRowCount + 1 then
  558. begin
  559. nCurNode := Items[zgBills.Selection.Top - zgBills.FixedRowCount];
  560. nCurNode.LocateDBRecord;
  561. end
  562. else
  563. nCurNode := Selected;
  564. iLast := nCurNode.MajorIndex + iRange - 1;
  565. nParent := nCurNode.Parent;
  566. nPreSibling := nCurNode.PrevSibling;
  567. while Assigned(nCurNode) and (nCurNode.MajorIndex <= iLast) do
  568. begin
  569. if Assigned(nParent) then
  570. begin
  571. if nParent.LastPosterity.MajorIndex < iLast then
  572. begin
  573. nCurNode := nParent;
  574. nParent := nCurNode.Parent;
  575. nPreSibling := nCurNode;
  576. end
  577. else
  578. begin
  579. if Assigned(nPreSibling) then
  580. aPreID := nPreSibling.ID
  581. else aPreID := -1;
  582. aLastID := -1;
  583. aParentID := nParent.ID;
  584. nCurNode := nParent.LastChild;
  585. while Assigned(nCurNode) and (nCurNode.MajorIndex > iLast) do
  586. begin
  587. aLastID := nCurNode.ID;
  588. nCurNode := nCurNode.PrevSibling;
  589. end;
  590. Break;
  591. end;
  592. end
  593. else
  594. begin
  595. // 删除预定义项,不作处理
  596. aParentID := -1;
  597. aPreID := nCurNode.PrevSiblingID;
  598. aLastID := nCurNode.NextSiblingID;
  599. Break;
  600. end;
  601. end;
  602. end;
  603. end;
  604. function TBillsProjectView.GetSelection(aStrList: TStringList; var aPreID,
  605. aLastID, aParentID: Integer): Integer;
  606. begin
  607. Result := GetSelectionInfo(aStrList);
  608. if Result > 0 then
  609. RepairTreeStructure(aPreID, aLastID, aParentID);
  610. end;
  611. procedure TBillsProjectView.ControlDrawQtyRT(AEnabled, AETree: Boolean);
  612. begin
  613. if AEnabled then
  614. zaDrawingQuantity.EnableControl
  615. else
  616. zaDrawingQuantity.DisableControl;
  617. end;
  618. procedure TBillsProjectView.cbSpanLevelSelItemsClick(Sender: TObject);
  619. begin
  620. if cbSpanLevelSelItems.Checked and cbAutoSelectItems.Checked then
  621. cbAutoSelectItems.Checked := False;
  622. end;
  623. procedure TBillsProjectView.cbAutoSelectItemsClick(Sender: TObject);
  624. begin
  625. if cbAutoSelectItems.Checked and cbSpanLevelSelItems.Checked then
  626. cbSpanLevelSelItems.Checked := False;
  627. end;
  628. function TBillsProjectView.GetSpanLevelSelectItems: Boolean;
  629. begin
  630. Result := cbSpanLevelSelItems.Checked;
  631. end;
  632. procedure TBillsProjectView.InitView;
  633. var i: integer;
  634. begin
  635. FIsGradeView := False;
  636. jpDetails.ActivePageIndex := 0;
  637. JimPages.ActivePageIndex := 0;
  638. {_zgBills.Height := Round(0.68 * Height);
  639. zgQtyItems.Height := Round(0.60 * Height);
  640. zgProjectBills.Height := Round(0.60 * Height); }
  641. for i := 0 to gStat.Columns.Count -1 do
  642. gStat.Columns[i].Footers[1].Color := $0086C2FF;
  643. TProject(FProject).BillsData.OnStat := DoOnStat;
  644. TProject(FProject).BillsData.Stat;
  645. // Modified by GiLi 2012-3-18 12:23:29
  646. // 界面的修改
  647. // 屏蔽评分功能
  648. // 屏蔽按钮
  649. btnStat.Visible := False;
  650. // 屏蔽分项清单表格评分列
  651. zaBills.Column('IsIgNore').Visible := False;
  652. zaBills.Column('ErrorHint').Visible := False;
  653. zaBills.Column('IsSuperscale').Visible := False;
  654. zaBills.Column('StandardGrade').Visible := False;
  655. zaBills.Column('DeductGrade').Visible := False;
  656. zaBills.Column('UserModified').Visible := False;
  657. LoadBillsViewOption;
  658. end;
  659. function TBillsProjectView.GetActivePage: Integer;
  660. begin
  661. Result := JimPages.ActivePageIndex;
  662. end;
  663. procedure TBillsProjectView.SetActivePage(const Value: Integer);
  664. begin
  665. JimPages.ActivePageIndex := Value;
  666. case Value of
  667. 0: zgBills.SetFocus;
  668. 1: zgQtyItems.SetFocus;
  669. 2: zgProjectBills.SetFocus;
  670. end;
  671. end;
  672. procedure TBillsProjectView.tbtnRefreshBillsClick(Sender: TObject);
  673. begin
  674. Screen.Cursor := crHourGlass;
  675. try
  676. TProject(FProject).DetailItemsDM.RefreshPQItems;
  677. finally
  678. Screen.Cursor := crDefault;
  679. end;
  680. end;
  681. function TBillsProjectView.GetActiveDetailPage: Integer;
  682. begin
  683. Result := jpDetails.ActivePageIndex;
  684. end;
  685. procedure TBillsProjectView.SetActiveDetailpage(const Value: Integer);
  686. begin
  687. jpDetails.ActivePageIndex := Value;
  688. end;
  689. procedure TBillsProjectView.PPItemsFramezgItemsMouseDown(Sender: TObject;
  690. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  691. begin
  692. PPItemsFrame.zgDetailItemsMouseDown(Sender, Button, Shift, X, Y);
  693. end;
  694. procedure TBillsProjectView.ztaProjectBillsGridGetCellText(Sender: TObject;
  695. const ACoord: TPoint; var Value: String);
  696. var
  697. OldActiveRec: Integer;
  698. begin
  699. if (ACoord.X = 1) and
  700. ztaProjectBills.ChangeActiveRecord(ACoord.Y - zgProjectBills.FixedRowCount, OldActiveRec) then
  701. begin
  702. try
  703. Value := ZjBooleanStr(TScBillsItem(ztaProjectBills.IDTree.Items[ACoord.Y - zgProjectBills.FixedRowCount]).Selected);
  704. finally
  705. ztaProjectBills.ChangeActiveRecord(OldActiveRec, OldActiveRec);
  706. end;
  707. end;
  708. end;
  709. procedure TBillsProjectView.ztaProjectBillsGridSetCellText(Sender: TObject;
  710. const ACoord: TPoint; var Value: String);
  711. procedure SelectNextSibling(ANode: TZjIDTreeNode; ASelected: Boolean);
  712. var
  713. xNode: TZjIDTreeNode;
  714. begin
  715. xNode := ANode;
  716. while Assigned(xNode.PrevSibling) do
  717. begin
  718. TScBillsItem(xNode.PrevSibling).Selected := ASelected;
  719. SyncSelected(xNode.PrevSiblingID, ASelected);
  720. //FIntegerList[xNode.PrevSibling.MajorIndex] := Ord(ASelected);
  721. xNode := xNode.PrevSibling;
  722. end;
  723. TScBillsItem(ANode).Selected := ASelected;
  724. SyncSelected(ANode.ID, ASelected);
  725. //FIntegerList[ANode.MajorIndex] := Ord(ASelected);
  726. while Assigned(ANode.NextSibling) do
  727. begin
  728. TScBillsItem(ANode.NextSibling).Selected := ASelected;
  729. SyncSelected(ANode.NextSiblingID, ASelected);
  730. //FIntegerList[ANode.NextSibling.MajorIndex] := Ord(ASelected);
  731. ANode := ANode.NextSibling;
  732. end;
  733. end;
  734. procedure SelectChildren(ANode: TZjIDTreeNode; iLevel: Integer; ASelected: Boolean);
  735. begin
  736. if ANode = nil then Exit;
  737. if ANode.Level = iLevel then
  738. begin
  739. SelectNextSibling(ANode, ASelected);
  740. Exit;
  741. end;
  742. if ANode.FirstChild <> nil then SelectChildren(ANode.FirstChild, iLevel, ASelected);
  743. if ANode.NextSibling <> nil then SelectChildren(ANode.NextSibling, iLevel, ASelected);
  744. end;
  745. procedure SelectItems(ANode: TZjIDTreeNode; ASelected: Boolean);
  746. var
  747. iLevel: Integer;
  748. blFlag: Boolean;
  749. xNode, zNode: TZjIDTreeNode;
  750. begin
  751. blFlag := False;
  752. iLevel := ANode.Level;
  753. xNode := ANode.Parent;
  754. while Assigned(xNode) do
  755. begin
  756. if TScBillsItem(xNode).Selected then
  757. begin
  758. blFlag := True;
  759. Break;
  760. end;
  761. xNode := xNode.Parent;
  762. end;
  763. if not blFlag then
  764. SelectNextSibling(ANode, ASelected)
  765. else if Assigned(xNode) then
  766. begin
  767. zNode := xNode.PrevSibling;
  768. while Assigned(zNode) do
  769. begin
  770. if TScBillsItem(zNode).Selected then
  771. SelectChildren(zNode.FirstChild, iLevel, ASelected);
  772. zNode := zNode.PrevSibling;
  773. end;
  774. SelectChildren(xNode.FirstChild, iLevel, ASelected);
  775. zNode := xNode;
  776. while Assigned(zNode) do
  777. begin
  778. if TScBillsItem(zNode).Selected then
  779. SelectChildren(zNode.FirstChild, iLevel, ASelected);
  780. zNode := zNode.NextSibling;
  781. end;
  782. end;
  783. end;
  784. var
  785. Node: TZjIDTreeNode;
  786. begin
  787. Node := ztaProjectBills.IDTree.Selected;
  788. if Assigned(Node) and (ACoord.X = 1) then
  789. begin
  790. BeginSelect;
  791. try
  792. TScBillsItem(Node).Selected := ZjStrToBoolean(Value);
  793. SyncSelected(Node.ID, ZjStrToBoolean(Value));
  794. if IsAutoSelectItems then
  795. SelectNextSibling(Node, ZjStrToBoolean(Value))
  796. else if IsSpanLevelSelectItems then
  797. SelectItems(Node, ZjStrToBoolean(Value));
  798. finally
  799. EndSelect;
  800. end;
  801. zgProjectBills.InvalidateCol(1);
  802. end;
  803. end;
  804. procedure TBillsProjectView.BeginSelect;
  805. begin
  806. zgProjectBills.BeginUpdate;
  807. ztaProjectBills.IDTree.BeginUpdate(True);
  808. ztaProjectBills.DisableControl(True);
  809. ControlBillsTreeRT(False);
  810. end;
  811. procedure TBillsProjectView.EndSelect;
  812. begin
  813. zgProjectBills.EndUpdate;
  814. ztaProjectBills.EnableControl;
  815. ztaProjectBills.IDTree.EndUpdate(False);
  816. ControlBillsTreeRT(True);
  817. end;
  818. procedure TBillsProjectView.EnterXMJBills;
  819. begin
  820. ztaProjectBills.IDTree := TProject(FProject).BillsData.XMJBillsTree;
  821. end;
  822. procedure TBillsProjectView.LeaveXMJBills;
  823. begin
  824. ztaProjectBills.IDTree := nil;
  825. end;
  826. procedure TBillsProjectView.SyncSelected(aID: Integer; aValue: Boolean);
  827. var
  828. sbiNode: TScBillsItem;
  829. begin
  830. sbiNode := TScBillsItem(TProject(FProject).BillsData.BillsTree.FindNode(aID));
  831. if Assigned(sbiNode) then
  832. sbiNode.SyncSelected(aValue);
  833. end;
  834. function TBillsProjectView.GetBidLotList: TStrings;
  835. begin
  836. Result := zcbBidLot.Items;
  837. end;
  838. procedure TBillsProjectView.SetBidLotList(const Value: TStrings);
  839. begin
  840. zcbBidLot.Items.Assign(Value);
  841. end;
  842. function TBillsProjectView.CanRefreshQtyItem: Boolean;
  843. begin
  844. Result := zaQtyItems.DataSet.RecordCount = 0;
  845. end;
  846. procedure TBillsProjectView.SetProject(const Value: TObject);
  847. begin
  848. FProject := Value;
  849. if Assigned(FProject) then
  850. begin
  851. with TProject(FProject) do
  852. begin
  853. zaBills.IDTree := BillsData.BillsTree;
  854. zaDrawingQuantity.DataSet := BillsData.cdsOrgDrawingQuantity;
  855. PPItemsFrame.ItemsDS := DetailItemsDM.cdsPPItems;
  856. PPItemsFrame.DetailItemsDS := DetailItemsDM.cdsPPDetailItems;
  857. PPItemsFrame.DrawQtyDS := DetailItemsDM.cdsPPDrawQty;
  858. QtyItemsFrame.ItemsDS := DetailItemsDM.cdsQIItems;
  859. QtyItemsFrame.DetailItemsDS := DetailItemsDM.cdsQIDetailItems;
  860. QtyItemsFrame.DrawQtyDS := DetailItemsDM.cdsQIDrawQty;
  861. zaQtyItems.DataSet := DetailItemsDM.cdsPQBills;
  862. PPItemsFrame.DetailItemsDM := DetailItemsDM;
  863. QtyItemsFrame.DetailItemsDM := DetailItemsDM;
  864. gStat.DataSource := BillsData.dsStat;
  865. end;
  866. end
  867. else
  868. begin
  869. zaBills.IDTree := nil;
  870. zaDrawingQuantity.DataSet := nil;
  871. PPItemsFrame.ItemsDS := nil;
  872. PPItemsFrame.DetailItemsDS := nil;
  873. PPItemsFrame.DrawQtyDS := nil;
  874. PPItemsFrame.DetailItemsDM := nil;
  875. QtyItemsFrame.ItemsDS := nil;
  876. QtyItemsFrame.DetailItemsDS := nil;
  877. QtyItemsFrame.DrawQtyDS := nil;
  878. QtyItemsFrame.DetailItemsDM := nil;
  879. gStat.DataSource := nil;
  880. end;
  881. end;
  882. procedure TBillsProjectView.ControlOwnerBid(aFlag: Integer);
  883. begin
  884. if aFlag = 1 then
  885. begin
  886. zgBills.CellClass.Cols[5] := TZjComboCell;
  887. FShowOwnerName := True;
  888. end
  889. else
  890. begin
  891. // chenshilong, 2011-01-26 10:39:42 Visible会影响后面的Boolean字段列的显示
  892. // zaBills.Columns[5].Visible := False;
  893. zaBills.Columns[5].Width := 0;
  894. FShowOwnerName := False;
  895. end;
  896. end;
  897. procedure TBillsProjectView.SetGridFocus(aPageIdx: Integer);
  898. begin
  899. case aPageIdx of
  900. 0: zgBills.SetFocus;
  901. 1: zgProjectBills.SetFocus;
  902. 2: zgQtyItems.SetFocus;
  903. end;
  904. end;
  905. procedure TBillsProjectView.zgProjectBillsCellGetColor(Sender: TObject;
  906. ACoord: TPoint; var AColor: TColor);
  907. var
  908. ztnNode: TZjIDTreeNode;
  909. begin
  910. if ztaProjectBills.IDTree = nil then Exit;
  911. ztnNode := ztaProjectBills.IDTree[ACoord.Y - zgProjectBills.FixedRowCount];
  912. if Assigned(ztnNode) then
  913. begin
  914. if ztnNode.ParentID = 1 then
  915. AColor := $00FBCAC4;
  916. end;
  917. end;
  918. procedure TBillsProjectView.zgBillsCellGetColor(Sender: TObject;
  919. ACoord: TPoint; var AColor: TColor);
  920. var
  921. ztnNode: TZjIDTreeNode;
  922. begin
  923. if zaBills.IDTree = nil then Exit;
  924. ztnNode := zaBills.IDTree[ACoord.Y - zgBills.FixedRowCount];
  925. if Assigned(ztnNode) then
  926. begin
  927. if Assigned(ztnNode.Parent) then
  928. begin
  929. if ztnNode.ParentID = 1 then
  930. AColor := $00FBCAC4
  931. // 预算项目节用颜色标识出来
  932. else if Trim(TScBillsItem(ztnNode).Code) <> '' then
  933. AColor := TColor($00F9E8DF);
  934. end;
  935. end;
  936. end;
  937. procedure TBillsProjectView.ControlXMJTreeView(aEnabled,
  938. aXMJTree: Boolean);
  939. begin
  940. if aEnabled then
  941. begin
  942. zgProjectBills.EndUpdate;
  943. //if Assigned(ztaProjectBills.IDTree) and Assigned(ztaProjectBills.IDTree.DataSet) then
  944. ztaProjectBills.EnableControl;
  945. if aXMJTree then
  946. begin
  947. if Assigned(ztaProjectBills.IDTree) and Assigned(ztaProjectBills.IDTree.DataSet) then
  948. ztaProjectBills.IDTree.EndUpdate(False);
  949. end;
  950. end
  951. else
  952. begin
  953. zgProjectBills.BeginUpdate;
  954. if aXMJTree then
  955. begin
  956. if Assigned(ztaProjectBills.IDTree) and Assigned(ztaProjectBills.IDTree.DataSet) then
  957. begin
  958. ztaProjectBills.IDTree.BeginUpdate(True);
  959. ztaProjectBills.DisableControl(True);
  960. end;
  961. end
  962. else
  963. ztaProjectBills.DisableControl;
  964. end;
  965. end;
  966. procedure TBillsProjectView.zgBillsBeforePaste(Sender: TObject;
  967. const ABounds: TRect; var Allow: Boolean);
  968. var
  969. iIndex: Integer;
  970. begin
  971. with TProject(FProject).BillsData.BillsTree do
  972. begin
  973. iIndex := ABounds.Top - zgBills.FixedRowCount;
  974. if (ABounds.Left < 3) and ((Items[iIndex] = nil) or (Items[iIndex].IsPreDefine)) then
  975. begin
  976. if Items[iIndex] = nil then
  977. MessageError(Handle, '不能在此插入记录 ')
  978. else
  979. MessageError(Handle, '不能覆盖预定义项, 如果要粘贴清单项,可以先在清单部分插入一条空记录,然后再粘贴. ');
  980. Allow := False;
  981. end
  982. else
  983. Allow := True;
  984. end;
  985. end;
  986. procedure TBillsProjectView.zgBillsCustomPaste(Sender: TObject;
  987. ABounds: TRect; ASourSheet: TZjSheet);
  988. var
  989. iRow : Integer;
  990. iCol : Integer;
  991. iSavePoint: Integer;
  992. iPosition : Integer;
  993. bBillsQty : Boolean;
  994. bDQQty : Boolean;
  995. bIsCode : Boolean;
  996. ztnNode : TZjIDTreeNode;
  997. sCode : string;
  998. sName : string;
  999. sBCode : string;
  1000. gField : TField;
  1001. begin
  1002. if ABounds.Left >= 3 then
  1003. begin
  1004. for iRow := ABounds.Top to ABounds.Bottom - 1 do
  1005. begin
  1006. // Not Expanded Node, Cannot Down Paste
  1007. if not TZJGrid(Sender).RowVisible[iRow] then Continue;
  1008. for iCol := ABounds.Left to ABounds.Right - 1 do
  1009. with TZJGrid(Sender).Cells[iCol, iRow] do
  1010. if CanEdit then Text := ASourSheet.Values[iCol - ABounds.Left, iRow - ABounds.Top];
  1011. end;
  1012. end
  1013. else
  1014. begin
  1015. if zaBills.DataSet is TClientDataSet then
  1016. iSavePoint := TClientDataSet(zaBills.DataSet).SavePoint;
  1017. ztnNode := TProject(FProject).BillsData.BillsTree.Selected;
  1018. if ztnNode = nil then Exit;
  1019. iPosition := GetPastePosition(ztnNode, bBillsQty, bDQQty);
  1020. if iPosition = -1 then Exit;
  1021. if iPosition = 3 then
  1022. begin
  1023. Screen.Cursor := crHourGlass;
  1024. try
  1025. for iRow := 0 to ASourSheet.RowCount - 1 do
  1026. for iCol := 0 to ASourSheet.ColCount - 1 do
  1027. begin
  1028. with TZJGrid(Sender).Cells[iCol + ABounds.Left , iRow + ABounds.Top] do
  1029. if CanEdit then Text := ASourSheet.Values[iCol, iRow];
  1030. end;
  1031. finally
  1032. Screen.Cursor := crDefault;
  1033. end;
  1034. Exit;
  1035. end;
  1036. bIsCode := ABounds.Left = 1;
  1037. Screen.Cursor := crHourGlass;
  1038. TProject(FProject).BillsData.BeginHandler(True);
  1039. zgBills.BeginUpdate;
  1040. zaBills.DisableControl;
  1041. try
  1042. try
  1043. if ASourSheet.RowCount > 0 then
  1044. begin
  1045. if bIsCode then
  1046. begin
  1047. if ASourSheet.ColCount - 1 >= 0 then
  1048. sCode := ASourSheet.Values[0, iRow];
  1049. if ASourSheet.ColCount - 1 >= 1 then
  1050. sBCode := ASourSheet.Values[1, iRow];
  1051. if (sCode <> '') and (sBCode <> '') then Abort;
  1052. end;
  1053. for iCol := 0 to ASourSheet.ColCount - 1 do
  1054. begin
  1055. if zaBills.FindField(iCol + ABounds.Left, gField) then
  1056. begin
  1057. zaBills.DataSet.Edit;
  1058. if bBillsQty and
  1059. ((gField.FieldName = 'Quantity')
  1060. or (gField.FieldName = 'UnitPrice')
  1061. or (gField.FieldName = 'TotalPrice')
  1062. or (gField.FieldName = 'DesignQuantity')
  1063. or (gField.FieldName = 'DesignQuantity2')
  1064. or (gField.FieldName = 'DesignPrice'))
  1065. then
  1066. gField.AsString := ''
  1067. else
  1068. gField.AsString := ASourSheet.Values[iCol, 0];
  1069. // gField.Tag := 0;
  1070. end;
  1071. end;
  1072. end;
  1073. if zaBills.DataSet.State in [dsEdit, dsInsert] then
  1074. zaBills.DataSet.Post;
  1075. for iRow := 1 to ASourSheet.RowCount - 1 do
  1076. for iCol := 0 to ASourSheet.ColCount - 1 do
  1077. begin
  1078. if bIsCode then
  1079. begin
  1080. if iCol = 0 then
  1081. begin
  1082. sCode := ASourSheet.Values[0, iRow];
  1083. if ASourSheet.ColCount - 1 >= 1 then
  1084. sBCode := ASourSheet.Values[1, iRow];
  1085. if ASourSheet.ColCount - 1 >= 2 then
  1086. sName := ASourSheet.Values[2, iRow];
  1087. if (sCode <> '') and (sBCode <> '') then
  1088. Abort
  1089. else if sCode <> '' then
  1090. ztnNode := TProject(FProject).BillsData.InsertItem(ztnNode, sCode, sName, True)
  1091. else
  1092. ztnNode := TProject(FProject).BillsData.InsertItem(ztnNode, sBCode, sName, False);
  1093. end;
  1094. // assign value ....
  1095. if zaBills.FindField(iCol + ABounds.Left, gField) then
  1096. begin
  1097. zaBills.DataSet.Edit;
  1098. if bBillsQty and
  1099. ((gField.FieldName = 'Quantity')
  1100. or (gField.FieldName = 'UnitPrice')
  1101. or (gField.FieldName = 'TotalPrice')
  1102. or (gField.FieldName = 'DesignQuantity')
  1103. or (gField.FieldName = 'DesignQuantity2')
  1104. or (gField.FieldName = 'DesignPrice'))
  1105. then
  1106. gField.AsString := ''
  1107. else
  1108. gField.AsString := ASourSheet.Values[iCol, iRow];
  1109. gField.Tag := 0;
  1110. end;
  1111. end
  1112. else // bcode
  1113. begin
  1114. if iCol = 0 then
  1115. begin
  1116. sCode := ASourSheet.Values[0, iRow];
  1117. if ASourSheet.ColCount - 1 >= 1 then
  1118. sName := ASourSheet.Values[1, iRow];
  1119. ztnNode := TProject(FProject).BillsData.InsertItem(ztnNode, sCode, sName, False);
  1120. end;
  1121. if zaBills.FindField(iCol + ABounds.Left, gField) then
  1122. begin
  1123. zaBills.DataSet.Edit;
  1124. if bBillsQty and
  1125. ((gField.FieldName = 'Quantity')
  1126. or (gField.FieldName = 'UnitPrice')
  1127. or (gField.FieldName = 'TotalPrice')
  1128. or (gField.FieldName = 'DesignQuantity')
  1129. or (gField.FieldName = 'DesignQuantity2')
  1130. or (gField.FieldName = 'DesignPrice'))
  1131. then
  1132. gField.AsString := ''
  1133. else
  1134. gField.AsString := ASourSheet.Values[iCol, iRow];
  1135. gField.Tag := 0;
  1136. end;
  1137. end;
  1138. if zaBills.DataSet.State in [dsEdit, dsInsert] then
  1139. zaBills.DataSet.Post;
  1140. end;
  1141. except
  1142. if zaBills.DataSet is TClientDataSet then
  1143. TClientDataSet(zaBills.DataSet).SavePoint := iSavePoint;
  1144. if Screen.Cursor <> crHourGlass then Screen.Cursor := crHourGlass;
  1145. try
  1146. TProject(FProject).BillsData.DisconnectBillsTree;
  1147. TProject(FProject).BillsData.ConnectionBillsTree;
  1148. finally
  1149. Screen.Cursor := crDefault;
  1150. end;
  1151. raise Exception.Create(' 您输入的数据类型不正确!粘贴操作失败! ');
  1152. end;
  1153. finally
  1154. zgBills.EndUpdate;
  1155. zaBills.EnableControl;
  1156. TProject(FProject).BillsData.EndHandler;
  1157. Screen.Cursor := crDefault;
  1158. end;
  1159. end;
  1160. end;
  1161. function TBillsProjectView.GetPastePosition(var aNode: TZjIDTreeNode; var ABillsQty,
  1162. ADQQty: Boolean): Integer;
  1163. var
  1164. iPos: Integer;
  1165. begin
  1166. Result := CheckBillsPastePosition(ABillsQty, ADQQty, True);
  1167. case Result of
  1168. cp_Next : aNode := TProject(FProject).BillsData.BillsTree.AddBillsItem(aNode.ParentID, aNode.NextSiblingID);
  1169. cp_Font : aNode := TProject(FProject).BillsData.BillsTree.AddBillsItem(aNode.ParentID, aNode.ID);
  1170. cp_Child : aNode := TProject(FProject).BillsData.BillsTree.AddBillsItem(aNode.ID, -1);
  1171. end;
  1172. end;
  1173. procedure TBillsProjectView.zgProjectBillsMouseDown(Sender: TObject;
  1174. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1175. begin
  1176. if Button = mbRight then
  1177. begin
  1178. dpmGather.PopupFromCursorPos;
  1179. end;
  1180. end;
  1181. procedure TBillsProjectView.tbAutoSelectNodeClick(Sender: TObject);
  1182. begin
  1183. ControlBillsTreeRT(False);
  1184. ControlXMJTreeView(False);
  1185. try
  1186. TProject(FProject).BillsData.SelectGatherNode(TProject(FProject).BillsData.XMJBillsTree.FirstNode, True);
  1187. finally
  1188. ControlXMJTreeView(True);
  1189. ControlBillsTreeRT(True);
  1190. end;
  1191. end;
  1192. procedure TBillsProjectView.tbCancelSelectNodeClick(Sender: TObject);
  1193. begin
  1194. ControlBillsTreeRT(False);
  1195. ControlXMJTreeView(False);
  1196. try
  1197. TProject(FProject).BillsData.SelectGatherNode(TProject(FProject).BillsData.XMJBillsTree.FirstNode, False);
  1198. finally
  1199. ControlBillsTreeRT(True);
  1200. ControlXMJTreeView(True);
  1201. end;
  1202. end;
  1203. procedure TBillsProjectView.QtyItemsFramezgItemsMouseDown(Sender: TObject;
  1204. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1205. begin
  1206. if Button = mbRight then
  1207. dpmQtyBills.PopupFromCursorPos;
  1208. end;
  1209. procedure TBillsProjectView.ControlDesignCode(AEnabled, AETree: Boolean);
  1210. begin
  1211. zgDrawingQuantity.BeginUpdate;
  1212. try
  1213. if AEnabled then
  1214. begin
  1215. zaDrawingQuantity.Columns[0].width := 33;
  1216. if Assigned(zaDrawingQuantity.DataSet) then
  1217. zaDrawingQuantity.DataSet.FieldByName('IsGatherQ').ReadOnly := False;
  1218. zaDrawingQuantity.Columns[1].Width := 150;
  1219. zaDrawingQuantity.Columns[2].Visible := True;
  1220. zaDrawingQuantity.Columns[3].Visible := True;
  1221. zaDrawingQuantity.Columns[4].Visible := True;
  1222. zaDrawingQuantity.Columns[5].Visible := True;
  1223. end
  1224. else
  1225. begin
  1226. zaDrawingQuantity.Columns[0].Width := 0;
  1227. if Assigned(zaDrawingQuantity.DataSet) then
  1228. zaDrawingQuantity.DataSet.FieldByName('IsGatherQ').ReadOnly := True;
  1229. zaDrawingQuantity.Columns[1].Width := 320;
  1230. zaDrawingQuantity.Columns[2].Visible := False;
  1231. zaDrawingQuantity.Columns[3].Visible := False;
  1232. zaDrawingQuantity.Columns[4].Visible := False;
  1233. zaDrawingQuantity.Columns[5].Visible := False;
  1234. end;
  1235. finally
  1236. zgDrawingQuantity.EndUpdate;
  1237. end;
  1238. end;
  1239. procedure TBillsProjectView.zgDrawingQuantityShowHint(var HintStr: String;
  1240. var CanShow: Boolean; var HintInfo: THintInfo; const ACoord: TPoint);
  1241. begin
  1242. if not zaDrawingQuantity.Columns[2].Visible then
  1243. begin
  1244. HintStr := '填写示例 —— ' + #10#13 + #10#13 +
  1245. '设计位置:K5+127.6 '+ #10#13 +
  1246. '设计位置:K9+576.3' + #10#13 +
  1247. '图号:S22-6' + #10#13 +
  1248. '图号:S23-8' + #10#13 + #10#13 +
  1249. '注意:请保留“设计位置:”、“图号:”字样';
  1250. CanShow := True;
  1251. end;
  1252. end;
  1253. procedure TBillsProjectView.SwitchBillsGradeView(AGradeView: Boolean);
  1254. var iFrom, iTo, i, idx, wth: Integer;
  1255. P: PColWidth;
  1256. begin
  1257. iFrom := zaBills.Columns.IndexByName('UnitPrice');
  1258. iTo := zaBills.Columns.IndexByName('MemoStr');
  1259. if AGradeView then
  1260. begin
  1261. FIsGradeView := True;
  1262. if Assigned(PList) then Exit;
  1263. PList := TList.Create;
  1264. // 用记录指针记下列和列宽,便于以后恢复。
  1265. for i := iFrom to iTo do
  1266. begin
  1267. New(P);
  1268. P.ColIndex := i;
  1269. P.ColWidth := zgBills.ColWidths[i];
  1270. PList.Add(P);
  1271. zgBills.ColWidths[i] := 0;
  1272. end;
  1273. if not btnStat.Down then
  1274. begin
  1275. btnStat.Down := True;
  1276. btnStat.Click;
  1277. end;
  1278. end
  1279. else // 恢复正常视图
  1280. begin
  1281. FIsGradeView := False;
  1282. if not Assigned(PList) then Exit;
  1283. // 恢复隐藏列的列宽
  1284. for I := 0 to PList.Count - 1 do
  1285. begin
  1286. idx := PColWidth(PList[I]).ColIndex;
  1287. wth := PColWidth(PList[I]).ColWidth;
  1288. zgBills.ColWidths[idx] := wth;
  1289. end;
  1290. // 先释放指针,再释放TList
  1291. for I := 0 to PList.Count - 1 do
  1292. begin
  1293. if Assigned(PList[I]) then
  1294. Dispose(PList[I]);
  1295. end;
  1296. PList.Free;
  1297. // 虽然PList被释放了,但Assigned(PList)值仍为True
  1298. PList := nil;
  1299. if not tbDrawingQuantity.Down then
  1300. begin
  1301. tbDrawingQuantity.Down := True;
  1302. tbDrawingQuantity.Click;
  1303. end;
  1304. end;
  1305. end;
  1306. procedure TBillsProjectView.zaBillsGridSetCellText(Sender: TObject;
  1307. const ACoord: TPoint; var Value: String);
  1308. begin
  1309. if ACoord.X in [15, 17, 18] then
  1310. TProject(FProject).BillsData.SetUserModifiedGrade;
  1311. end;
  1312. procedure TBillsProjectView.zgBillsShowHint(var HintStr: String;
  1313. var CanShow: Boolean; var HintInfo: THintInfo; const ACoord: TPoint);
  1314. var s: string;
  1315. OldActiveRecd: Integer;
  1316. begin
  1317. if ACoord.X = 14 then
  1318. HintInfo.HintStr := '忽略:勾选后,自动评分时该清单不参与评分和统计。'
  1319. else if ACoord.X = 19 then
  1320. HintInfo.HintStr := '锁定:勾选后,自动评分时用户修改信息不会被覆盖。'
  1321. else if ACoord.X = 15 then
  1322. begin
  1323. s := '';
  1324. { if zaBills.ChangeActiveRecord(ACoord.Y - zgBills.FixedRowCount, OldActiveRecd)then
  1325. begin
  1326. try
  1327. if zaBills.DataSet.FieldByName('NameErrorFlag').AsInteger = 1 then
  1328. begin
  1329. s := '当前名称:' + zaBills.DataSet.FieldByName('Name').AsString + #10;
  1330. s := s + '标准名称:' + zaBills.DataSet.FieldByName('RightName').AsString + #10#13#13;
  1331. end;
  1332. if zaBills.DataSet.FieldByName('UnitsErrorFlag').AsInteger = 1 then
  1333. begin
  1334. s := s + '当前单位:' + zaBills.DataSet.FieldByName('Units').AsString + #10;
  1335. s := s + '标准单位:' + zaBills.DataSet.FieldByName('RightUnits').AsString;
  1336. end;
  1337. if Trim(s) = '' then Exit;
  1338. HintInfo.HintStr := s;
  1339. finally
  1340. zaBills.ChangeActiveRecord(OldActiveRecd, OldActiveRecd);
  1341. end;
  1342. end; }
  1343. if zaBills.DataSet.FieldByName('NameErrorFlag').AsInteger = 1 then
  1344. begin
  1345. s := '当前名称:“' + zaBills.DataSet.FieldByName('Name').AsString + '”' + #10;
  1346. s := s + '标准名称:“' + zaBills.DataSet.FieldByName('RightName').AsString + '”' + #10#13#13;
  1347. end;
  1348. if zaBills.DataSet.FieldByName('UnitsErrorFlag').AsInteger = 1 then
  1349. begin
  1350. s := s + '当前单位:“' + zaBills.DataSet.FieldByName('Units').AsString + '”' + #10;
  1351. s := s + '标准单位:“' + zaBills.DataSet.FieldByName('RightUnits').AsString + '”' + #10#13#13;;
  1352. end;
  1353. if Trim(s) = '' then Exit;
  1354. s := s + '参考文件(预算项目节):' + ExtractFileName(TProject(FProject).BillsData.PBStdTreeFile) + #10;
  1355. s := s + '参考文件(清单子目号):' + ExtractFileName(TProject(FProject).BillsData.BQStdTreeFile);
  1356. HintInfo.HintStr := s;
  1357. end
  1358. else Exit;
  1359. CanShow := True;
  1360. HintInfo.HintMaxWidth := 600;
  1361. HintInfo.HideTimeout := 30000;
  1362. end;
  1363. procedure TBillsProjectView.DoOnStat(AFJF: Currency; AYsCount, AQdCount: Integer);
  1364. // 最终得分,质量分
  1365. var cZZDF, cZLF: Currency;
  1366. vDS: TDataSource;
  1367. begin
  1368. gStat.Columns[1].Footers[1].ValueType := fvtStaticText;
  1369. gStat.Columns[1].Footers[1].Value := IntToStr(AYsCount + AQdCount) +
  1370. '行(预' + IntToStr(AYsCount) + ',清' + IntToStr(AQdCount) + ')';
  1371. gStat.Columns[5].Footers[1].ValueType := fvtStaticText;
  1372. gStat.Columns[5].Footers[1].Value := CurrToStr(AFJF);
  1373. gStat.Columns[7].Footers[1].ValueType := fvtStaticText;
  1374. cZZDF := StrToCurr(gStat.GetFooterValue(0, gStat.Columns[7]));
  1375. cZLF := AFJF + cZZDF;
  1376. if cZLF > 100 then
  1377. cZLF := 100;
  1378. gStat.Columns[7].Footers[1].Value := CurrToStr(cZLF);
  1379. // 以下用于刷新显示
  1380. vDS := gStat.DataSource;
  1381. gStat.DataSource := nil;
  1382. gStat.DataSource := vDS;
  1383. end;
  1384. procedure TBillsProjectView.AdjustControlsSize;
  1385. begin
  1386. pnlFXQD_Btm.Height := Round(pnlFXQD_Btm.Parent.Height / 3);
  1387. zgQtyItems.Height := Round(zgQtyItems.Parent.Height / 2) - ToolBar1.Height - Splitter2.Height;
  1388. zgProjectBills.Height := Round(zgProjectBills.Parent.Height / 2) - Panel2.Height - Splitter4.Height;
  1389. end;
  1390. procedure TBillsProjectView.CopyBillsToRecycleBin;
  1391. begin
  1392. zgBills.Tag := 2;
  1393. zgBills.CopyToClipboard(zgBills.Selection.Bounds);
  1394. end;
  1395. function TBillsProjectView.GetRBNodeName(AIndex: Integer): string;
  1396. var
  1397. Item: TScBillsItem;
  1398. begin
  1399. Result := '';
  1400. Item := TProject(FProject).BillsData.BillsTree.Items[AIndex];
  1401. if Item <> nil then
  1402. Result := Item.SBillCode + Item.SBillBCode + Item.SBillName;
  1403. end;
  1404. procedure TBillsProjectView.btnOneKeyGatherNodeClick(Sender: TObject);
  1405. var
  1406. iID: Integer;
  1407. sGatherName: string;
  1408. strFilePath: string;
  1409. iProjectType, iProjKind, iGatherID: Integer;
  1410. aProject, nProject: TProject;
  1411. bIsExist: Boolean;
  1412. begin
  1413. ControlBillsTreeRT(False);
  1414. ControlXMJTreeView(False);
  1415. try
  1416. TProject(FProject).BillsData.SelectGatherNode(TProject(FProject).BillsData.XMJBillsTree.FirstNode, True);
  1417. finally
  1418. ControlXMJTreeView(True);
  1419. ControlBillsTreeRT(True);
  1420. end;
  1421. {$IFDEF _beEncrypt}
  1422. DelayCheckDog;
  1423. CheckDogErrorCountAndHint;
  1424. {$ENDIF}
  1425. if not TProject(FProject).BillsData.HasSelected then
  1426. TProject(FProject).BillsData.SelectGatherNode(TProject(FProject).BillsData.XMJBillsTree.FirstNode, True);
  1427. // 检查是否是建设项目
  1428. TProject(FProject).CheckBeforeGather;
  1429. // 获得名称
  1430. sGatherName := Format('%s[项目清单]', [MainFrm.jtsBillsProjects.Tabs[MainFrm.jtsBillsProjects.TabIndex]]);
  1431. // 获得项目类型
  1432. iProjectType := TProject(FProject).ProjectType;
  1433. // 判断文件是否存在,如存在则然后在询问是否覆盖
  1434. if not MainFrm.ProjectFileManager.ProjectMgrDM.ChackSameProjectForOneKey(TProject(FProject).GetGatherID, sGatherName, bIsExist) then
  1435. begin
  1436. Exit;
  1437. end;
  1438. strFilePath := MainFrm.ProjectFileManager.CreateNewProjectForOneKey(sGatherName, iID, TProject(FProject).GetGatherID);
  1439. Application.ProcessMessages;
  1440. Screen.Cursor := crHourGlass;
  1441. // 界面上加提示
  1442. MainFrm.BeginUserOperation(sGatherWord);
  1443. aProject := MainFrm.ProjectManager.ActiveProject;
  1444. nProject := MainFrm.ProjectManager.CreateNewProject(strFilePath, sGatherName, MainFrm.StdBillsCtrl, iProjectType, iID);
  1445. nProject.ProjectView.Project{.BillsData} := nil;
  1446. IncProgressUI(15);
  1447. try
  1448. if not aProject.GatherProject(nProject) then
  1449. begin
  1450. IncProgressUI(80);
  1451. MessageHint(0, sGatherError);
  1452. DeleteFile(Format('%s%s.smb', [MainFrm.DirPath, sGatherName]));
  1453. end;
  1454. finally
  1455. MainFrm.ProjectManager.RemoveProject(nProject, aProject, False);
  1456. MainFrm.EndUserOperation;
  1457. Screen.Cursor := crDefault;
  1458. IncProgressUI(100);
  1459. end;
  1460. end;
  1461. function TBillsProjectView.IsCanCopyBills: Boolean;
  1462. begin
  1463. if not Assigned(zaBills.IDTree) then
  1464. begin
  1465. Result := False;
  1466. Exit;
  1467. end;
  1468. if not Assigned(zaBills.IDTree.Selected) then
  1469. begin
  1470. Result := False;
  1471. Exit;
  1472. end;
  1473. // 第二部分黑体 不允许复制整块
  1474. if zaBills.IDTree.Selected.ID = 2 then
  1475. begin
  1476. Result := False;
  1477. Exit;
  1478. end;
  1479. Result := True;
  1480. end;
  1481. function TBillsProjectView.IsCanGridPaste: Boolean;
  1482. begin
  1483. if not zgBills.Focused then
  1484. begin
  1485. Result := True;
  1486. Exit;
  1487. end;
  1488. // 第二部分黑体 不允许粘贴整块
  1489. if Assigned(zaBills.IDTree.Selected) and (zaBills.IDTree.Selected.ID = 2) then
  1490. begin
  1491. Result := False;
  1492. Exit;
  1493. end;
  1494. Result := True;
  1495. end;
  1496. procedure TBillsProjectView.SetShowDesignQuantity(const Value: Boolean);
  1497. begin
  1498. zaBills.Column('DesignQuantity').Visible := Value;
  1499. zaBills.Column('DesignQuantity2').Visible := Value;
  1500. end;
  1501. procedure TBillsProjectView.SetShowDrawingCode(const Value: Boolean);
  1502. begin
  1503. zaBills.Column('DrawingCode').Visible := Value;
  1504. end;
  1505. procedure TBillsProjectView.SetShowEconomicMark(const Value: Boolean);
  1506. begin
  1507. zaBills.Column('DesignPrice').Visible := Value;
  1508. end;
  1509. procedure TBillsProjectView.LoadBillsViewOption;
  1510. begin
  1511. ShowDesignQuantity := ScConfigInfo.ShowDesignQuantity;
  1512. ShowEconomicMark := ScConfigInfo.ShowEconomicMark;
  1513. ShowDrawingCode := ScConfigInfo.ShowDrawingCode;
  1514. end;
  1515. end.