BillsMeasureFme.pas 24 KB

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