PhaseCompareFme.pas 5.5 KB

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