PhaseCompareFme.pas 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. unit PhaseCompareFme;
  2. interface
  3. uses
  4. PhaseCompareDm, BillsTree,
  5. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  6. Dialogs, ZJGrid, ExtCtrls, sdGridDBA, sdGridTreeDBA;
  7. type
  8. TPhaseCompareFrame = class(TFrame)
  9. stdPhaseCompare: TsdGridTreeDBA;
  10. pnlPhaseCompare: TPanel;
  11. zgPhaseCompare: TZJGrid;
  12. procedure zgPhaseCompareCellGetColor(Sender: TObject; ACoord: TPoint;
  13. var AColor: TColor);
  14. private
  15. FPhaseCompareData: TPhaseCompareData;
  16. FCompareStageCount: Integer;
  17. procedure ClearStageColumns;
  18. procedure InitStageColumns;
  19. procedure BeginExpandNode;
  20. procedure EndExpandNode;
  21. procedure SetCompareStageCount(const Value: Integer);
  22. public
  23. constructor Create(AProjectFrame: TFrame; PhaseCompareData: TPhaseCompareData);
  24. procedure ExpandNodeTo(ALevel: Integer);
  25. procedure ExpandXmjNode;
  26. procedure ExpandCurPhase;
  27. property CompareStageCount: Integer read FCompareStageCount write SetCompareStageCount;
  28. end;
  29. implementation
  30. uses
  31. ProjectData, PhaseData, sdIDTree, UtilMethods;
  32. {$R *.dfm}
  33. { TPhaseCompareFrame }
  34. procedure TPhaseCompareFrame.BeginExpandNode;
  35. begin
  36. zgPhaseCompare.OnCellGetColor := nil;
  37. BeginUpdateWindow(zgPhaseCompare.Handle);
  38. stdPhaseCompare.DisableControl;
  39. end;
  40. procedure TPhaseCompareFrame.ClearStageColumns;
  41. var
  42. iStage: Integer;
  43. vCol: TsdGridColumn;
  44. begin
  45. for iStage := 0 to FCompareStageCount - 1 do
  46. begin
  47. vCol := stdPhaseCompare.Column('Quantity' + IntToStr(iStage));
  48. if Assigned(vCol) then
  49. stdPhaseCompare.Columns.Delete(vCol.Index);
  50. vCol := stdPhaseCompare.Column('TotalPrice' + IntToStr(iStage));
  51. if Assigned(vCol) then
  52. stdPhaseCompare.Columns.Delete(vCol.Index);
  53. end;
  54. end;
  55. constructor TPhaseCompareFrame.Create(AProjectFrame: TFrame;
  56. PhaseCompareData: TPhaseCompareData);
  57. begin
  58. inherited Create(AProjectFrame);
  59. FPhaseCompareData := PhaseCompareData;
  60. FCompareStageCount := 0;
  61. with TProjectData(FPhaseCompareData.ProjectData).PhaseData do
  62. if Active then
  63. CompareStageCount := PhaseProperty.AuditCount + 1;
  64. stdPhaseCompare.IDTree := FPhaseCompareData.CompareTree;
  65. end;
  66. procedure TPhaseCompareFrame.EndExpandNode;
  67. begin
  68. stdPhaseCompare.EnableControl;
  69. EndUpdateWindow(zgPhaseCompare.Handle);
  70. zgPhaseCompare.OnCellGetColor := zgPhaseCompareCellGetColor;
  71. zgPhaseCompare.Invalidate;
  72. end;
  73. procedure TPhaseCompareFrame.ExpandXmjNode;
  74. begin
  75. BeginExpandNode;
  76. try
  77. FPhaseCompareData.ExpandXmjNode;
  78. finally
  79. EndExpandNode;
  80. end;
  81. end;
  82. procedure TPhaseCompareFrame.ExpandNodeTo(ALevel: Integer);
  83. begin
  84. BeginExpandNode;
  85. try
  86. FPhaseCompareData.ExpandNodeTo(ALevel);
  87. finally
  88. EndExpandNode;
  89. end;
  90. end;
  91. procedure TPhaseCompareFrame.InitStageColumns;
  92. function StageName(AStageIndex: Integer): string;
  93. begin
  94. if AStageIndex = 0 then
  95. Result := '原报'
  96. else
  97. Result := Format('%d 审', [AStageIndex]);
  98. end;
  99. procedure AddStageColumns(AStageIndex: Integer);
  100. var
  101. vColumn: TsdGridColumn;
  102. begin
  103. vColumn := stdPhaseCompare.Columns.Add;
  104. vColumn.FieldName := Format('Quantity%d', [AStageIndex]);
  105. vColumn.Title.Caption := Format('%s|数量', [StageName(AStageIndex)]);
  106. vColumn.Title.CaptionAcrossCols := '2';
  107. vColumn.Width := 60;
  108. vColumn.Alignment :=taRightJustify;
  109. vColumn.ReadOnly := True;
  110. vColumn := stdPhaseCompare.Columns.Add;
  111. vColumn.FieldName := Format('TotalPrice%d', [AStageIndex]);
  112. vColumn.Title.Caption := Format('|金额', [StageName(AStageIndex)]);
  113. vColumn.Width := 60;
  114. vColumn.Alignment := taRightJustify;
  115. vColumn.ReadOnly := True;
  116. end;
  117. var
  118. iStage: Integer;
  119. begin
  120. for iStage := 0 to CompareStageCount - 1 do
  121. AddStageColumns(iStage);
  122. end;
  123. procedure TPhaseCompareFrame.SetCompareStageCount(const Value: Integer);
  124. begin
  125. ClearStageColumns;
  126. FCompareStageCount := Value;
  127. InitStageColumns;
  128. end;
  129. procedure TPhaseCompareFrame.zgPhaseCompareCellGetColor(Sender: TObject;
  130. ACoord: TPoint; var AColor: TColor);
  131. function CheckSameQuantity: Boolean;
  132. var
  133. iCol: Integer;
  134. begin
  135. iCol := 5;
  136. Result := True;
  137. while Result and (iCol + 2 < zgPhaseCompare.ColCount) do
  138. begin
  139. with zgPhaseCompare do
  140. Result := Cells[iCol, ACoord.Y].Text = Cells[iCol + 2, ACoord.Y].Text;
  141. Inc(iCol, 2);
  142. end;
  143. end;
  144. function CheckSameTotalPrice: Boolean;
  145. var
  146. iCol: Integer;
  147. begin
  148. iCol := 6;
  149. Result := True;
  150. while Result and (iCol + 2 < zgPhaseCompare.ColCount) do
  151. begin
  152. with zgPhaseCompare do
  153. Result := Cells[iCol, ACoord.Y].Text = Cells[iCol + 2, ACoord.Y].Text;
  154. Inc(iCol, 2);
  155. end;
  156. end;
  157. var
  158. stnNode: TsdIDTreeNode;
  159. iCreatePhaseID: Integer;
  160. begin
  161. if ACoord.Y > stdPhaseCompare.IDTree.Count + 1 then Exit;
  162. stnNode := stdPhaseCompare.IDTree.Items[ACoord.Y - 2];
  163. iCreatePhaseID := stnNode.Rec.ValueByName('CreatePhaseID').AsInteger;
  164. // 根据层次底色不同
  165. if stnNode.ParentID = 1 then
  166. AColor := $00FBCAC4
  167. else if (stnNode.Rec.ValueByName('B_Code').AsString = '') and (stnNode.Level > 0) then
  168. AColor := $00F9E8DF;
  169. // 根据节点创建期数底色不同
  170. if iCreatePhaseID > 0 then
  171. begin
  172. if iCreatePhaseID > TProjectData(FPhaseCompareData.ProjectData).PhaseIndex then
  173. AColor := clSilver
  174. else if iCreatePhaseID = TProjectData(FPhaseCompareData.ProjectData).PhaseIndex then
  175. AColor := clInfoBk;
  176. end;
  177. // 各阶段数量或者金额不等,该行底色标红
  178. if (zgPhaseCompare.ColCount > 7) and not stnNode.HasChildren then
  179. begin
  180. if not CheckSameQuantity or not CheckSameTotalPrice then
  181. AColor := $00646AFE;
  182. end;
  183. end;
  184. procedure TPhaseCompareFrame.ExpandCurPhase;
  185. begin
  186. BeginExpandNode;
  187. try
  188. FPhaseCompareData.ExpandCurPhase;
  189. finally
  190. EndExpandNode;
  191. end;
  192. end;
  193. end.