BillsMeasureFme.pas 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. unit BillsMeasureFme;
  2. interface
  3. uses
  4. BillsMeasureDm, UtilMethods, BillsClipboard, sdIDTreeCells,
  5. ColVisibleManager,
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, ZJGrid, ComCtrls, ToolWin, StdCtrls, ExtCtrls, sdGridDBA,
  8. sdGridTreeDBA, sdDB, ActnList, dxBar, sdIDTree, JimLabels;
  9. type
  10. TBillsMeasureFrame = class(TFrame)
  11. pnlExprs: TPanel;
  12. laEdtExprs: TLabeledEdit;
  13. pnlBills: TPanel;
  14. zgBillsMeasure: TZJGrid;
  15. stdBillsMeasure: TsdGridTreeDBA;
  16. dxpmBills: TdxBarPopupMenu;
  17. alBills: TActionList;
  18. actnCalculateAll: TAction;
  19. actnExportGridToExcel: TAction;
  20. actnSetStageBookmark: TAction;
  21. pnlNodeDetail: TPanel;
  22. pnlDealProperty: TPanel;
  23. labDealPropertyTitle: TJimGradLabel;
  24. zgDealProperty: TZJGrid;
  25. dxpmBillsCol: TdxBarPopupMenu;
  26. actnHiddenCol: TAction;
  27. actnCancelHiddenCol: TAction;
  28. procedure dxpmBillsPopup(Sender: TObject);
  29. procedure zgBillsMeasureMouseDown(Sender: TObject; Button: TMouseButton;
  30. Shift: TShiftState; X, Y: Integer);
  31. procedure laEdtExprsKeyDown(Sender: TObject; var Key: Word;
  32. Shift: TShiftState);
  33. procedure laEdtExprsExit(Sender: TObject);
  34. procedure actnCalculateAllExecute(Sender: TObject);
  35. procedure zgBillsMeasureCellGetColor(Sender: TObject; ACoord: TPoint;
  36. var AColor: TColor);
  37. procedure actnExportGridToExcelExecute(Sender: TObject);
  38. procedure zgBillsMeasureCellButtonClick(Sender: TObject; Col,
  39. Row: Integer);
  40. procedure zgBillsMeasureCustomPaste(Sender: TObject; ABounds: TRect;
  41. ASourSheet: TZjSheet);
  42. procedure zgBillsMeasureKeyDown(Sender: TObject; var Key: Word;
  43. Shift: TShiftState);
  44. procedure actnSetStageBookmarkExecute(Sender: TObject);
  45. procedure zgBillsMeasureCurrentChanged(Sender: TObject; Col,
  46. Row: Integer);
  47. procedure zgDealPropertyCellGetFont(Sender: TObject; ACoord: TPoint;
  48. AFont: TFont);
  49. procedure zgDealPropertyCellTextChanged(Sender: TObject; Col,
  50. Row: Integer);
  51. procedure zgDealPropertyCellCanEdit(Sender: TObject;
  52. const ACoord: TPoint; var Allow: Boolean);
  53. procedure actnSetStageBookmarkUpdate(Sender: TObject);
  54. procedure dxpmBillsColPopup(Sender: TObject);
  55. procedure actnHiddenColExecute(Sender: TObject);
  56. procedure actnCancelHiddenColExecute(Sender: TObject);
  57. private
  58. FBillsMeasureData: TBillsMeasureData;
  59. FShowPriceChange: Boolean;
  60. FShowBGLCode: Boolean;
  61. FShowDesignQuantity: Boolean;
  62. FShowAddField: Boolean; // For Inner Test
  63. FShowPMField: Boolean; // For Inner Test
  64. FOnAfterSetBookmark: TBookmarkRefreshEvent;
  65. FShowAlias: Boolean;
  66. FColVisibleManager: TBM_ColVisibleManager;
  67. procedure ExpandMouseDown(AGridCell: TzjCell);
  68. function GridColToDBACol(AGridCol: Integer): Integer;
  69. procedure ShowGridCols(AShow: Boolean; ALeft, ARight: Integer);
  70. function CheckExprsColumn: Boolean;
  71. procedure SetColumnVisible(const AColumn: string; AVisible: Boolean);
  72. procedure SetAddFieldVisible(AValue: Boolean);
  73. procedure SetPMFieldVisible(AValue: Boolean);
  74. procedure LoadDealProperty(ARec: TsdDataRecord);
  75. procedure BeginExpandNode;
  76. procedure EndExpandNode;
  77. procedure ResetPhaseDataReadOnly(AReadOnly: Boolean);
  78. procedure ResetBaseDataReadOnly(AReadOnly: Boolean);
  79. procedure ResetAllowInsert(AAllow: Boolean);
  80. procedure SetShowPriceChange(const Value: Boolean);
  81. procedure SetShowBGLCode(const Value: Boolean);
  82. procedure SetShowDesignQuantity(const Value: Boolean);
  83. procedure SetShowAlias(const Value: Boolean);
  84. public
  85. constructor Create(AProjectFrame: TFrame; ABillsMeasureData: TBillsMeasureData);
  86. destructor Destroy; override;
  87. procedure ExpandNodeTo(ALevel: Integer);
  88. procedure ExpandXmjNode;
  89. procedure ExpandCurPhase;
  90. procedure RefreshPhase_Stage;
  91. property ShowPriceChange: Boolean read FShowPriceChange write SetShowPriceChange;
  92. property ShowBGLCode: Boolean read FShowBGLCode write SetShowBGLCode;
  93. property ShowDesignQuantity: Boolean read FShowDesignQuantity write SetShowDesignQuantity;
  94. property ShowAlias: Boolean read FShowAlias write SetShowAlias;
  95. property OnAfterSetBookmark: TBookmarkRefreshEvent read FOnAfterSetBookmark write FOnAfterSetBookmark;
  96. property BillsMeasureData: TBillsMeasureData read FBillsMeasureData;
  97. end;
  98. implementation
  99. {$R *.dfm}
  100. uses
  101. MainFrm, ProjectFme, ProjectData, ExportExcel, BGLDm, BGLSelectFrm,
  102. Types, ZhAPI, BillsTree, mDataRecord, ConditionalDefines;
  103. { TBillsFrame }
  104. constructor TBillsMeasureFrame.Create(AProjectFrame: TFrame;
  105. ABillsMeasureData: TBillsMeasureData);
  106. begin
  107. inherited Create(AProjectFrame);
  108. FBillsMeasureData := ABillsMeasureData;
  109. stdBillsMeasure.IDTree := FBillsMeasureData.BillsMeasureTree;
  110. zgBillsMeasure.OnExpandMouseDown := ExpandMouseDown;
  111. FColVisibleManager := TBM_ColVisibleManager.Create(stdBillsMeasure.Columns);
  112. end;
  113. destructor TBillsMeasureFrame.Destroy;
  114. begin
  115. FColVisibleManager.Free;
  116. inherited;
  117. end;
  118. procedure TBillsMeasureFrame.dxpmBillsPopup(Sender: TObject);
  119. begin
  120. SetDxBtnAction(actnCalculateAll, MainForm.dxbtnCalculateAll);
  121. SetDxBtnAction(actnExportGridToExcel, MainForm.dxbtnExportGridToExcel);
  122. SetDxBtnAction(actnSetStageBookmark, MainForm.dxbtnSetBookmark);
  123. end;
  124. procedure TBillsMeasureFrame.zgBillsMeasureMouseDown(Sender: TObject;
  125. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  126. var
  127. vCol: TsdGridColumn;
  128. vViewCol: TsdViewColumn;
  129. begin
  130. if Button = mbRight then
  131. begin
  132. if _IsDebugView and (zgBillsMeasure.Selection.SelectType = stCol) and (Y < (zgBillsMeasure.RowHeights[0] + zgBillsMeasure.RowHeights[1])) then
  133. dxpmBillsCol.PopupFromCursorPos
  134. else
  135. dxpmBills.PopupFromCursorPos;
  136. end
  137. else
  138. begin
  139. if CheckExprsColumn then
  140. laEdtExprs.Text := zgBillsMeasure.CurCell.EditText
  141. else
  142. laEdtExprs.Text := '';
  143. stdBillsMeasure.FindColumn(zgBillsMeasure.CurCol, vCol);
  144. laEdtExprs.ReadOnly := vCol.ReadOnly;
  145. end;
  146. end;
  147. procedure TBillsMeasureFrame.SetShowPriceChange(const Value: Boolean);
  148. begin
  149. FShowPriceChange := Value;
  150. FColVisibleManager.ShowPriceChange(FShowPriceChange);
  151. end;
  152. procedure TBillsMeasureFrame.laEdtExprsKeyDown(Sender: TObject; var Key: Word;
  153. Shift: TShiftState);
  154. begin
  155. if Key = VK_Return then
  156. begin
  157. zgBillsMeasure.SetFocus;
  158. if not TLabeledEdit(Sender).ReadOnly then
  159. if CheckExprsColumn then
  160. zgBillsMeasure.CurCell.Text := laEdtExprs.Text;
  161. end;
  162. end;
  163. procedure TBillsMeasureFrame.laEdtExprsExit(Sender: TObject);
  164. begin
  165. if not TLabeledEdit(Sender).ReadOnly then
  166. if CheckExprsColumn then
  167. zgBillsMeasure.CurCell.Text := laEdtExprs.Text;
  168. end;
  169. procedure TBillsMeasureFrame.actnCalculateAllExecute(Sender: TObject);
  170. begin
  171. TProjectData(FBillsMeasureData.ProjectData).CalculateAll;
  172. end;
  173. procedure TBillsMeasureFrame.zgBillsMeasureCellGetColor(Sender: TObject; ACoord: TPoint;
  174. var AColor: TColor);
  175. var
  176. stnNode: TMeasureBillsIDTreeNode;
  177. iCreatePhaseID: Integer;
  178. StageRec: TStageRecord;
  179. fDiffer: Double;
  180. begin
  181. AColor := clWindow;
  182. if ACoord.Y > stdBillsMeasure.IDTree.Count + 1 then Exit;
  183. stnNode := TMeasureBillsIDTreeNode(stdBillsMeasure.IDTree.Items[ACoord.Y - 2]);
  184. if not Assigned(stnNode) then Exit;
  185. iCreatePhaseID := stnNode.Rec.CreatePhaseID.AsInteger;
  186. // 根据层次底色不同
  187. if stnNode.ParentID = 1 then
  188. AColor := $00FBCAC4
  189. else if (stnNode.Rec.B_Code.AsString = '') and (stnNode.Level > 0) then
  190. AColor := $00F9E8DF;
  191. // 书签
  192. if TProjectData(FBillsMeasureData.ProjectData).ProjProperties.PhaseCount > 0 then
  193. begin
  194. StageRec := stnNode.StageRec;
  195. if Assigned(StageRec) and StageRec.HasBookmark.AsBoolean then
  196. AColor := $00CFE2F9;
  197. end;
  198. // 根据节点创建期数底色不同
  199. if iCreatePhaseID > 0 then
  200. begin
  201. // 当前期不存在节点,底色为灰色提示用户
  202. if iCreatePhaseID > TProjectData(FBillsMeasureData.ProjectData).PhaseIndex then
  203. AColor := $00D5D5D5
  204. // 当前期新增节点,底色为黄色提示用户
  205. else if iCreatePhaseID = TProjectData(FBillsMeasureData.ProjectData).PhaseIndex then
  206. AColor := $00A7FDFD;
  207. end;
  208. // 叶子节点,累计合同计量超过0号台账,整行数据的底色变为暗红提示用户
  209. if not stnNode.HasChildren then
  210. begin
  211. with stnNode.Rec do
  212. begin
  213. if CalcType.AsInteger = 0 then
  214. fDiffer := QuantityRoundTo(AddDealQuantity.AsFloat - Quantity.AsFloat)
  215. else
  216. fDiffer := TotalPriceRoundTo(AddDealTotalPrice.AsFloat - TotalPrice.AsFloat);
  217. if fDiffer > 0 then
  218. AColor := $00646AFE;
  219. end;
  220. end;
  221. end;
  222. procedure TBillsMeasureFrame.SetColumnVisible(const AColumn: string;
  223. AVisible: Boolean);
  224. begin
  225. if AVisible then
  226. stdBillsMeasure.Column(AColumn).Width := 60
  227. else
  228. stdBillsMeasure.Column(AColumn).Width := 0;
  229. end;
  230. procedure TBillsMeasureFrame.SetShowBGLCode(const Value: Boolean);
  231. begin
  232. FShowBGLCode := Value;
  233. FColVisibleManager.ShowBGLCode(FShowBGLCode);
  234. end;
  235. procedure TBillsMeasureFrame.actnExportGridToExcelExecute(Sender: TObject);
  236. var
  237. sFileName: string;
  238. ExcelExportor: TExcelExportor;
  239. begin
  240. if SaveFile(sFileName, '.xls') then
  241. begin
  242. ExcelExportor := TExcelExportor.Create;
  243. try
  244. ExcelExportor.ExportToFile(zgBillsMeasure, sFileName);
  245. finally
  246. ExcelExportor.Free;
  247. end;
  248. end;
  249. end;
  250. function TBillsMeasureFrame.CheckExprsColumn: Boolean;
  251. var
  252. iCol: Integer;
  253. begin
  254. iCol := zgBillsMeasure.CurCol - zgBillsMeasure.FixedColCount;
  255. Result := (iCol = stdBillsMeasure.VisibleCol('CurDealQuantity'))
  256. or (iCol = stdBillsMeasure.VisibleCol('CurDealTotalPrice'))
  257. or (iCol = stdBillsMeasure.VisibleCol('CurQcQuantity'))
  258. or (iCol = stdBillsMeasure.VisibleCol('CurQcTotalPrice'))
  259. or (iCol = stdBillsMeasure.VisibleCol('CurPcQuantity'))
  260. or (iCol = stdBillsMeasure.VisibleCol('CurPcTotalPrice'));
  261. end;
  262. procedure TBillsMeasureFrame.zgBillsMeasureCellButtonClick(Sender: TObject;
  263. Col, Row: Integer);
  264. procedure SelectAndUpdateBGL(const AType, AField: string; ANode: TsdIDTreeNode);
  265. var
  266. vOrgBGL, vNewBGL: TBGLSelectInfo;
  267. StageRec: TStageRecord;
  268. begin
  269. if not Assigned(ANode) then Exit;
  270. StageRec := TMeasureBillsIDTreeNode(ANode).StageRec;
  271. try
  272. if Assigned(StageRec) then
  273. begin
  274. vOrgBGL := TBGLSelectInfo.Create(ANode.Rec,
  275. StageRec.ValueByName(AType + AField).AsFloat, True);
  276. vOrgBGL.MergedCode := StageRec.ValueByName(AType + 'BGLCode').AsString;
  277. vOrgBGL.MergedNum := StageRec.ValueByName(AType + 'BGLNum').AsString;
  278. end
  279. else
  280. vOrgBGL := TBGLSelectInfo.Create(ANode.Rec, 0, True);
  281. vNewBGL := TBGLSelectInfo.Create(ANode.Rec, 0, False);
  282. if SelectBGLAndBGNum(vOrgBGL, vNewBGL, FBillsMeasureData.ProjectData) then
  283. begin
  284. if not Assigned(StageRec) then
  285. begin
  286. StageRec := FBillsMeasureData.StageData.AddStageRecord(ANode.ID);
  287. TMeasureBillsIDTreeNode(ANode).StageRec := StageRec;
  288. end;
  289. StageRec.ValueByName(AType + AField).AsFloat := vNewBGL.TotalNum;
  290. StageRec.ValueByName(AType + 'BGLCode').AsString := vNewBGL.MergedCode;
  291. StageRec.ValueByName(AType + 'BGLNum').AsString := vNewBGL.MergedNum;
  292. FBillsMeasureData.StageData.UpdateBGLInfo(StageRec, AType);
  293. FBillsMeasureData.UpdateBGLInfo(ANode.ID, StageRec, AType);
  294. TProjectData(FBillsMeasureData.ProjectData).BGLData.ApplyBGL(vOrgBGL, vNewBGL);
  295. // 重新计算合同支付所有数据
  296. TProjectData(FBillsMeasureData.ProjectData).PhaseData.PhasePayData.CalculateAll;
  297. end;
  298. finally
  299. vOrgBGL.Free;
  300. vNewBGL.Free;
  301. end;
  302. end;
  303. procedure GetTypeAndField(var AType, AField: string);
  304. begin
  305. if (Col = stdBillsMeasure.VisibleCol('CurQcQuantity') + 1) then
  306. begin
  307. AType := 'Qc';
  308. AField := 'Quantity';
  309. end
  310. else if (Col = stdBillsMeasure.VisibleCol('CurPcQuantity') + 1) then
  311. begin
  312. AType := 'Pc';
  313. AField := 'Quantity';
  314. end;
  315. end;
  316. var
  317. stnCurNode: TBillsIDTreeNode;
  318. sType, sField: string;
  319. begin
  320. stnCurNode := TBillsIDTreeNode(stdBillsMeasure.IDTree.Selected);
  321. if stnCurNode.HasChildren then Exit;
  322. with TProjectData(FBillsMeasureData.ProjectData) do
  323. if PhaseData.StageDataReadOnly then Exit;
  324. GetTypeAndField(sType, sField);
  325. if (sType = '') or (sField = '') then Exit;
  326. if stnCurNode.Rec.CalcType.AsInteger = 1 then
  327. begin
  328. WarningMessage('该清单不可输入数量单价,如需使用数量×单价计算,请先清空所有直接输入的金额!');
  329. Exit;
  330. end;
  331. SelectAndUpdateBGL(sType, sField, stnCurNode);
  332. end;
  333. procedure TBillsMeasureFrame.zgBillsMeasureCustomPaste(Sender: TObject;
  334. ABounds: TRect; ASourSheet: TZjSheet);
  335. var
  336. iRow, iCol: Integer;
  337. begin
  338. for iRow := ABounds.Top to ABounds.Bottom - 1 do
  339. begin
  340. if not zgBillsMeasure.RowVisible[iRow] then Continue;
  341. for iCol := ABounds.Left to ABounds.Right - 1 do
  342. with TZJGrid(Sender).Cells[iCol, iRow] do
  343. if CanEdit then Text := ASourSheet.Values[iCol - ABounds.Left, iRow - ABounds.Top];
  344. end;
  345. end;
  346. procedure TBillsMeasureFrame.SetShowDesignQuantity(const Value: Boolean);
  347. begin
  348. FShowDesignQuantity := Value;
  349. FColVisibleManager.ShowDesign(FShowDesignQuantity);
  350. end;
  351. procedure TBillsMeasureFrame.SetAddFieldVisible(AValue: Boolean);
  352. begin
  353. FShowAddField := AValue;
  354. stdBillsMeasure.Column('AddDealQuantity').Visible := AValue;
  355. stdBillsMeasure.Column('AddDealTotalPrice').Visible := AValue;
  356. stdBillsMeasure.Column('AddQcQuantity').Visible := AValue;
  357. stdBillsMeasure.Column('AddQcTotalPrice').Visible := AValue;
  358. stdBillsMeasure.Column('AddPcQuantity').Visible := AValue;
  359. stdBillsMeasure.Column('AddPcTotalPrice').Visible := AValue;
  360. stdBillsMeasure.Column('AddGatherQuantity').Visible := AValue;
  361. stdBillsMeasure.Column('AddGatherTotalPrice').Visible := AValue;
  362. end;
  363. procedure TBillsMeasureFrame.zgBillsMeasureKeyDown(Sender: TObject;
  364. var Key: Word; Shift: TShiftState);
  365. begin
  366. // For Inner Test
  367. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  368. and (Key in [65, 97]) // 'a', 'A'
  369. and (zgBillsMeasure.CurCol = 4) then
  370. SetAddFieldVisible(not FShowAddField);
  371. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  372. and (Key in [80, 112]) // 'p', 'P' - Parent
  373. and (zgBillsMeasure.CurCol = 5) then
  374. begin
  375. FBillsMeasureData.ShowParentData := not FBillsMeasureData.ShowParentData;
  376. zgBillsMeasure.Invalidate;
  377. end;
  378. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  379. and (Key in [77, 109]) // 'm', 'M' - PriceMargin
  380. and (zgBillsMeasure.CurCol = 5) then
  381. begin
  382. SetPMFieldVisible(not FShowPMField);
  383. end;
  384. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  385. and (Key in [67, 99]) then // 'c', 'C'
  386. actnCalculateAll.Execute;
  387. end;
  388. procedure TBillsMeasureFrame.actnSetStageBookmarkExecute(Sender: TObject);
  389. var
  390. vNode: TMeasureBillsIDTreeNode;
  391. StageRec: TStageRecord;
  392. begin
  393. vNode := TMeasureBillsIDTreeNode(FBillsMeasureData.BillsMeasureTree.Selected);
  394. StageRec := vNode.StageRec;
  395. if not Assigned(StageRec) then
  396. begin
  397. StageRec := FBillsMeasureData.StageData.AddStageRecord(stdBillsMeasure.IDTree.Selected.ID);
  398. vNode.StageRec := StageRec;
  399. end;
  400. if StageRec.HasBookMark.AsBoolean then
  401. begin
  402. StageRec.HasBookMark.AsBoolean := False;
  403. StageRec.MarkMemo.AsString := '';
  404. end
  405. else
  406. StageRec.HasBookMark.AsBoolean := True;
  407. TProjectData(FBillsMeasureData.ProjectData).BillsBookmarkData.RefreshStageBookmark;
  408. if Assigned(FOnAfterSetBookmark) then
  409. FOnAfterSetBookmark(StageRec.HasBookMark.AsBoolean);
  410. zgBillsMeasure.InvalidateRow(zgBillsMeasure.CurRow);
  411. end;
  412. procedure TBillsMeasureFrame.zgBillsMeasureCurrentChanged(Sender: TObject;
  413. Col, Row: Integer);
  414. var
  415. stnNode: TsdIDTreeNode;
  416. bShowDealProperty: Boolean;
  417. begin
  418. stnNode := stdBillsMeasure.IDTree.Selected;
  419. bShowDealProperty := False;
  420. if Assigned(stnNode) then
  421. begin
  422. bShowDealProperty := stnNode.Rec.ValueByName('DealCode').AsString <> '';
  423. pnlNodeDetail.Visible := bShowDealProperty;
  424. LoadDealProperty(stnNode.Rec);
  425. end;
  426. end;
  427. procedure TBillsMeasureFrame.LoadDealProperty(ARec: TsdDataRecord);
  428. var
  429. fHasPay, fNotPay: Double;
  430. begin
  431. zgDealProperty.OnCellTextChanged := nil;
  432. zgDealProperty.Cells[0, 0].Text := '合同类别';
  433. zgDealProperty.Cells[0, 1].Text := ARec.ValueByName('DealType').AsString;
  434. zgDealProperty.Cells[0, 1].Align := gaCenterLeft;
  435. zgDealProperty.ColWidths[0] := 80;
  436. zgDealProperty.Cells[1, 0].Text := '累计应扣款';
  437. zgDealProperty.Cells[1, 1].Text := ARec.ValueByName('AddCutTotalPrice').AsString;
  438. zgDealProperty.Cells[1, 1].Align := gaCenterRight;
  439. zgDealProperty.ColWidths[1] := 80;
  440. zgDealProperty.Cells[2, 0].Text := '累计应支付';
  441. fHasPay := TotalPriceRoundTo(
  442. ARec.ValueByName('AddGatherTotalPrice').AsFloat - ARec.ValueByName('AddCutTotalPrice').AsFloat);
  443. zgDealProperty.Cells[2, 1].Text := FloatToStr(fHasPay);
  444. zgDealProperty.Cells[2, 1].Align := gaCenterRight;
  445. zgDealProperty.ColWidths[2] := 80;
  446. zgDealProperty.Cells[3, 0].Text := '累计已支付';
  447. zgDealProperty.Cells[3, 1].Text := ARec.ValueByName('AddPayTotalPrice').AsString;
  448. zgDealProperty.Cells[3, 1].Align := gaCenterRight;
  449. zgDealProperty.ColWidths[3] := 80;
  450. zgDealProperty.Cells[4, 0].Text := '待支付';
  451. fNotPay := TotalPriceRoundTo(fHasPay - ARec.ValueByName('AddPayTotalPrice').AsFloat);
  452. zgDealProperty.Cells[4, 1].Text := FloatToStr(fNotPay);
  453. zgDealProperty.Cells[4, 1].Align := gaCenterRight;
  454. zgDealProperty.ColWidths[4] := 80;
  455. zgDealProperty.OnCellTextChanged := zgDealPropertyCellTextChanged;
  456. end;
  457. procedure TBillsMeasureFrame.zgDealPropertyCellGetFont(Sender: TObject;
  458. ACoord: TPoint; AFont: TFont);
  459. begin
  460. if ((ACoord.X = 2) or (ACoord.X = 4)) and (ACoord.Y = 1) then
  461. AFont.Color := clGrayText;
  462. end;
  463. procedure TBillsMeasureFrame.zgDealPropertyCellTextChanged(Sender: TObject;
  464. Col, Row: Integer);
  465. procedure ModifyField(ARec: TsdDataRecord; const AField: string; ACell: TzjCell);
  466. var
  467. fValue, fHasPay, fNotPay: Double;
  468. begin
  469. if (ACell.Text = '') or TryStrToFloat(ACell.Text, fValue) then
  470. begin
  471. ARec.ValueByName(AField).AsString := ACell.Text;
  472. // 更新显示应支付&待支付数据
  473. fHasPay := TotalPriceRoundTo(
  474. ARec.ValueByName('AddGatherTotalPrice').AsFloat - ARec.ValueByName('AddCutTotalPrice').AsFloat);
  475. zgDealProperty.Cells[2, 1].Text := FloatToStr(fHasPay);
  476. fNotPay := TotalPriceRoundTo(fHasPay - ARec.ValueByName('AddPayTotalPrice').AsFloat);
  477. zgDealProperty.Cells[4, 1].Text := FloatToStr(fNotPay);
  478. end
  479. else
  480. begin
  481. ErrorMessage('只允许输入数字!!');
  482. ACell.Text := ARec.ValueByName(AField).AsString;
  483. end;
  484. end;
  485. var
  486. Rec: TsdDataRecord;
  487. begin
  488. Rec := stdBillsMeasure.IDTree.Selected.Rec;
  489. case Col of
  490. 0: Rec.ValueByName('DealType').AsString := zgDealProperty.Cells[Col, Row].Text;
  491. 1: ModifyField(Rec, 'AddCutTotalPrice', zgDealProperty.Cells[Col, Row]);
  492. 3: ModifyField(Rec, 'AddPayTotalPrice', zgDealProperty.Cells[Col, Row]);
  493. end;
  494. end;
  495. procedure TBillsMeasureFrame.zgDealPropertyCellCanEdit(Sender: TObject;
  496. const ACoord: TPoint; var Allow: Boolean);
  497. begin
  498. Allow := (ACoord.X = 0) or (ACoord.X = 1) or (ACoord.X = 3);
  499. end;
  500. procedure TBillsMeasureFrame.SetShowAlias(const Value: Boolean);
  501. begin
  502. FShowAlias := Value;
  503. FColVisibleManager.ShowAlias(FShowAlias);
  504. end;
  505. procedure TBillsMeasureFrame.actnSetStageBookmarkUpdate(Sender: TObject);
  506. begin
  507. TAction(Sender).Enabled := TProjectData(FBillsMeasureData.ProjectData).ProjProperties.PhaseCount > 0;
  508. end;
  509. procedure TBillsMeasureFrame.ExpandNodeTo(ALevel: Integer);
  510. begin
  511. BeginExpandNode;
  512. try
  513. FBillsMeasureData.ExpandNodeTo(ALevel);
  514. finally
  515. EndExpandNode;
  516. end;
  517. end;
  518. procedure TBillsMeasureFrame.ExpandXmjNode;
  519. begin
  520. BeginExpandNode;
  521. try
  522. FBillsMeasureData.ExpandXmjNode;
  523. finally
  524. EndExpandNode;
  525. end;
  526. end;
  527. procedure TBillsMeasureFrame.BeginExpandNode;
  528. begin
  529. zgBillsMeasure.BeginUpdate;
  530. zgBillsMeasure.OnCellGetColor := nil;
  531. BeginUpdateWindow(zgBillsMeasure.Handle);
  532. stdBillsMeasure.DisableControl;
  533. end;
  534. procedure TBillsMeasureFrame.EndExpandNode;
  535. begin
  536. stdBillsMeasure.EnableControl;
  537. EndUpdateWindow(zgBillsMeasure.Handle);
  538. zgBillsMeasure.OnCellGetColor := zgBillsMeasureCellGetColor;
  539. zgBillsMeasure.EndUpdate;
  540. end;
  541. procedure TBillsMeasureFrame.ExpandCurPhase;
  542. begin
  543. BeginExpandNode;
  544. try
  545. FBillsMeasureData.ExpandCurPhase;
  546. finally
  547. EndExpandNode;
  548. end;
  549. end;
  550. procedure TBillsMeasureFrame.RefreshPhase_Stage;
  551. begin
  552. with TProjectData(FBillsMeasureData.ProjectData) do
  553. begin
  554. ResetPhaseDataReadOnly(StageDataReadOnly);
  555. ResetBaseDataReadOnly(BaseDataReadOnly);
  556. ResetAllowInsert(AllowInsert);
  557. end;
  558. zgBillsMeasure.Invalidate;
  559. end;
  560. procedure TBillsMeasureFrame.ResetPhaseDataReadOnly(AReadOnly: Boolean);
  561. begin
  562. stdBillsMeasure.Column('CurDealQuantity').ReadOnly := AReadOnly;
  563. stdBillsMeasure.Column('CurDealTotalPrice').ReadOnly := AReadOnly;
  564. stdBillsMeasure.Column('CurQcQuantity').ReadOnly := AReadOnly;
  565. stdBillsMeasure.Column('CurPcQuantity').ReadOnly := AReadOnly;
  566. end;
  567. procedure TBillsMeasureFrame.ResetBaseDataReadOnly(AReadOnly: Boolean);
  568. begin
  569. stdBillsMeasure.Column('Code').ReadOnly := AReadOnly;
  570. stdBillsMeasure.Column('B_Code').ReadOnly := AReadOnly;
  571. stdBillsMeasure.Column('Name').ReadOnly := AReadOnly;
  572. stdBillsMeasure.Column('Units').ReadOnly := AReadOnly;
  573. stdBillsMeasure.Column('Price').ReadOnly := AReadOnly;
  574. stdBillsMeasure.Column('NewPrice').ReadOnly := AReadOnly;
  575. stdBillsMeasure.Column('DrawingCode').ReadOnly := AReadOnly;
  576. end;
  577. procedure TBillsMeasureFrame.ResetAllowInsert(AAllow: Boolean);
  578. begin
  579. if AAllow then
  580. stdBillsMeasure.Options := stdBillsMeasure.Options + [aoAllowInsert]
  581. else
  582. stdBillsMeasure.Options := stdBillsMeasure.Options - [aoAllowInsert];
  583. end;
  584. procedure TBillsMeasureFrame.SetPMFieldVisible(AValue: Boolean);
  585. begin
  586. FShowAddField := AValue;
  587. stdBillsMeasure.Column('PM_PreTotalPrice').Visible := AValue;
  588. stdBillsMeasure.Column('PM_TotalPrice').Visible := AValue;
  589. stdBillsMeasure.Column('PM_AddTotalPrice').Visible := AValue;
  590. end;
  591. procedure TBillsMeasureFrame.ExpandMouseDown(AGridCell: TzjCell);
  592. procedure CommonExpand(vNode: TsdIDTreeNode);
  593. begin
  594. AGridCell.Grid.BeginUpdate;
  595. vNode.Expanded := not vNode.Expanded;
  596. AGridCell.Grid.EndUpdate;
  597. AGridCell.Grid.InvalidateView(AGridCell.ViewRect);
  598. end;
  599. procedure QuikExpand(vNode: TsdIDTreeNode);
  600. begin
  601. Screen.Cursor := crHourGlass;
  602. BeginExpandNode;
  603. try
  604. vNode.Expanded := not vNode.Expanded;
  605. finally
  606. EndExpandNode;
  607. Screen.Cursor := crDefault;
  608. end;
  609. end;
  610. var
  611. stnNode: TsdIDTreeNode;
  612. begin
  613. stnNode := TsdIDTreeCell(AGridCell).TreeNode;
  614. if stnNode.PosterityCount > 10000 then
  615. QuikExpand(stnNode)
  616. else
  617. CommonExpand(stnNode);
  618. end;
  619. procedure TBillsMeasureFrame.dxpmBillsColPopup(Sender: TObject);
  620. begin
  621. SetDxBtnAction(actnHiddenCol, MainForm.dxbtnHidden);
  622. SetDxBtnAction(actnCancelHiddenCol, MainForm.dxbtnCancelHidden);
  623. end;
  624. procedure TBillsMeasureFrame.actnHiddenColExecute(Sender: TObject);
  625. begin
  626. ShowGridCols(False, zgBillsMeasure.Selection.Left, zgBillsMeasure.Selection.Right-1);
  627. end;
  628. function TBillsMeasureFrame.GridColToDBACol(AGridCol: Integer): Integer;
  629. var
  630. iCol, iVisibleCount: Integer;
  631. begin
  632. Result := -1;
  633. if AGridCol > stdBillsMeasure.VisibleColCount then Exit;
  634. iVisibleCount := 0;
  635. for iCol := 0 to stdBillsMeasure.Columns.Count - 1 do
  636. begin
  637. if stdBillsMeasure.Columns.Items[iCol].Visible then
  638. begin
  639. Inc(iVisibleCount);
  640. if iVisibleCount = AGridCol then
  641. begin
  642. Result := iCol;
  643. Break;
  644. end;
  645. end;
  646. end;
  647. end;
  648. procedure TBillsMeasureFrame.actnCancelHiddenColExecute(Sender: TObject);
  649. begin
  650. ShowGridCols(True, zgBillsMeasure.Selection.Left, zgBillsMeasure.Selection.Right-1);
  651. end;
  652. procedure TBillsMeasureFrame.ShowGridCols(AShow: Boolean; ALeft,
  653. ARight: Integer);
  654. var
  655. iCol, iBegin, iEnd: Integer;
  656. begin
  657. iBegin := GridColToDBACol(ALeft);
  658. iEnd := GridColToDBACol(ARight);
  659. FColVisibleManager.ShowGridCol(AShow, iBegin, iEnd);
  660. end;
  661. end.