| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 | unit PhaseCompareFme;interfaceuses  PhaseCompareDm, BillsTree,  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ZJGrid, ExtCtrls, sdGridDBA, sdGridTreeDBA;type  TPhaseCompareFrame = class(TFrame)    stdPhaseCompare: TsdGridTreeDBA;    pnlPhaseCompare: TPanel;    zgPhaseCompare: TZJGrid;    procedure zgPhaseCompareCellGetColor(Sender: TObject; ACoord: TPoint;      var AColor: TColor);  private    FPhaseCompareData: TPhaseCompareData;    FCompareStageCount: Integer;    procedure ClearStageColumns;    procedure InitStageColumns;    procedure BeginExpandNode;    procedure EndExpandNode;    procedure SetCompareStageCount(const Value: Integer);  public    constructor Create(AProjectFrame: TFrame; PhaseCompareData: TPhaseCompareData);    procedure ExpandNodeTo(ALevel: Integer);    procedure ExpandXmjNode;    procedure ExpandCurPhase;    property CompareStageCount: Integer read FCompareStageCount write SetCompareStageCount;  end;implementationuses  ProjectData, PhaseData, sdIDTree, UtilMethods;{$R *.dfm}{ TPhaseCompareFrame }procedure TPhaseCompareFrame.BeginExpandNode;begin  zgPhaseCompare.OnCellGetColor := nil;  BeginUpdateWindow(zgPhaseCompare.Handle);  stdPhaseCompare.DisableControl;end;procedure TPhaseCompareFrame.ClearStageColumns;var  iStage: Integer;  vCol: TsdGridColumn;begin  for iStage := 0 to FCompareStageCount - 1 do  begin    vCol := stdPhaseCompare.Column('Quantity' + IntToStr(iStage));    if Assigned(vCol) then      stdPhaseCompare.Columns.Delete(vCol.Index);    vCol := stdPhaseCompare.Column('TotalPrice' + IntToStr(iStage));    if Assigned(vCol) then      stdPhaseCompare.Columns.Delete(vCol.Index);  end;end;constructor TPhaseCompareFrame.Create(AProjectFrame: TFrame;  PhaseCompareData: TPhaseCompareData);begin  inherited Create(AProjectFrame);  FPhaseCompareData := PhaseCompareData;  FCompareStageCount := 0;  with TProjectData(FPhaseCompareData.ProjectData).PhaseData do    if Active then      CompareStageCount := PhaseProperty.AuditCount + 1;  stdPhaseCompare.IDTree := FPhaseCompareData.CompareTree;end;procedure TPhaseCompareFrame.EndExpandNode;begin  stdPhaseCompare.EnableControl;  EndUpdateWindow(zgPhaseCompare.Handle);  zgPhaseCompare.OnCellGetColor := zgPhaseCompareCellGetColor;  zgPhaseCompare.Invalidate;end;procedure TPhaseCompareFrame.ExpandXmjNode;begin  BeginExpandNode;  try    FPhaseCompareData.ExpandXmjNode;  finally    EndExpandNode;  end;end;procedure TPhaseCompareFrame.ExpandNodeTo(ALevel: Integer);begin  BeginExpandNode;  try    FPhaseCompareData.ExpandNodeTo(ALevel);  finally    EndExpandNode;  end;end;procedure TPhaseCompareFrame.InitStageColumns;  function StageName(AStageIndex: Integer): string;  begin    if AStageIndex = 0 then      Result := '原报'    else      Result := Format('%d 审', [AStageIndex]);  end;  procedure AddStageColumns(AStageIndex: Integer);  var    vColumn: TsdGridColumn;  begin    vColumn := stdPhaseCompare.Columns.Add;    vColumn.FieldName := Format('Quantity%d', [AStageIndex]);    vColumn.Title.Caption := Format('%s|数量', [StageName(AStageIndex)]);    vColumn.Title.CaptionAcrossCols := '2';    vColumn.Width := 60;    vColumn.Alignment :=taRightJustify;    vColumn.ReadOnly := True;        vColumn := stdPhaseCompare.Columns.Add;    vColumn.FieldName := Format('TotalPrice%d', [AStageIndex]);    vColumn.Title.Caption := Format('|金额', [StageName(AStageIndex)]);    vColumn.Width := 60;    vColumn.Alignment := taRightJustify;    vColumn.ReadOnly := True;  end;var  iStage: Integer;begin  for iStage := 0 to CompareStageCount - 1 do    AddStageColumns(iStage);end;procedure TPhaseCompareFrame.SetCompareStageCount(const Value: Integer);begin  ClearStageColumns;  FCompareStageCount := Value;  InitStageColumns;end;procedure TPhaseCompareFrame.zgPhaseCompareCellGetColor(Sender: TObject;  ACoord: TPoint; var AColor: TColor);  function CheckSameQuantity: Boolean;  var    iCol: Integer;  begin    iCol := 5;    Result := True;    while Result and (iCol + 2 < zgPhaseCompare.ColCount) do    begin      with zgPhaseCompare do        Result := Cells[iCol, ACoord.Y].Text = Cells[iCol + 2, ACoord.Y].Text;      Inc(iCol, 2);    end;  end;  function CheckSameTotalPrice: Boolean;  var    iCol: Integer;  begin    iCol := 6;    Result := True;    while Result and (iCol + 2 < zgPhaseCompare.ColCount) do    begin      with zgPhaseCompare do        Result := Cells[iCol, ACoord.Y].Text = Cells[iCol + 2, ACoord.Y].Text;      Inc(iCol, 2);    end;  end;var  stnNode: TsdIDTreeNode;  iCreatePhaseID: Integer;begin  if ACoord.Y > stdPhaseCompare.IDTree.Count + 1 then Exit;  stnNode := stdPhaseCompare.IDTree.Items[ACoord.Y - 2];  iCreatePhaseID := stnNode.Rec.ValueByName('CreatePhaseID').AsInteger;  // 根据层次底色不同  if stnNode.ParentID = 1 then    AColor := $00FBCAC4  else if (stnNode.Rec.ValueByName('B_Code').AsString = '') and (stnNode.Level > 0) then    AColor := $00F9E8DF;  // 根据节点创建期数底色不同  if iCreatePhaseID > 0 then  begin    if iCreatePhaseID > TProjectData(FPhaseCompareData.ProjectData).PhaseIndex then      AColor := clSilver    else if iCreatePhaseID = TProjectData(FPhaseCompareData.ProjectData).PhaseIndex then      AColor := clInfoBk;  end;  // 各阶段数量或者金额不等,该行底色标红  if (zgPhaseCompare.ColCount > 7) and not stnNode.HasChildren then  begin    if not CheckSameQuantity or not CheckSameTotalPrice then      AColor := $00646AFE;  end;end;procedure TPhaseCompareFrame.ExpandCurPhase;begin  BeginExpandNode;  try    FPhaseCompareData.ExpandCurPhase;  finally    EndExpandNode;  end;end;end.
 |