cxgridexportlink.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,695 行 · 第 1/5 页

PAS
1,695
字号
  AExportItem: TcxExportVisualItem;
begin
  AHeight := Viewinfo.RecordsViewInfo.GroupRowHeight;
  R := Rect(0, ATop, RecordWidth, ATop + AHeight);
  R.Left := AddIndents(ATop, AHeight, ARow, True);
  Styles.GetGroupParams(ARow, ARow.Level, AViewParams);
  AddVisualItemEx(R, '', AViewParams, taLeftJustify, [], clDefault, True);
  if IsSummaryUnderColumns and ARow.GetGroupSummaryInfo(AItems, AValues) then
  begin
    GroupSummaryItemsList.Clear;
    GroupSummaryItemsList.Capacity := 1024;
    for I := 0 to AItems.Count - 1 do
      ProcessGroupSummaryItem(ARow, AValues, I, R, AViewParams);
    GroupSummaryItemsList.Sort(@cxCompareGroupSummaryItems);
    ProcessGroupSummaryItems(ARow, R);
    for I := 0 to GroupSummaryItemCount - 1 do
    begin
      AItem := GroupSummaryItems[I];
      AExportItem := AddVisualItemEx(AItem.Bounds, AItem.Text, AItem.ViewParams,
        AItem.Alignment, GridLines - [bLeft, bRight], GridLineColor, False);
      if UseNativeFormat and not VarIsNull(AItem.Value) then
      begin
        AExportItem.Data2 := AItem.SummaryItem;
        AExportItem.Value := AItem.Value;
      end;
    end;
  end
  else
  begin
    S := ARow.DisplayText;
    TcxCustomGridTableItemAccess.DoGetDisplayText(ARow.GroupedColumn, ARow, S);
    AddVisualItemEx(R, S, AViewParams,
      taLeftJustify, GridLines, GridLineColor, False);
  end;
  Inc(ATop, AHeight);
end;

function TcxGridTableViewExport.AddIndents(ATop, ARowHeight: Integer;
  ARow: TcxCustomGridRecord; AHasButton: Boolean; ALevel: Integer = -1): Integer;
var
  R: TRect;
  I: Integer;
  AText: string;
  AStyle: TcxCacheCellStyle;
  AGridLines: TcxBorders; 
  AViewParams: TcxViewParams;
begin
  if ALevel = -1 then
    ALevel := ARow.Level - 1 + Byte(AHasButton);
  while (ALevel >= 0) and (ALevel < ARow.Level) do
    ARow := TcxGridDataRow(ARow).ParentRecord;
  R := Rect(ALevel * ViewInfo.LevelIndent, ATop,
    (ALevel + 1) * ViewInfo.LevelIndent, ATop + ARowHeight);
  AGridLines := GridLines;
  if not ARow.IsLast or AHasButton and ARow.Expanded then
    AGridLines := GridLines - [bBottom];
  for I := ALevel downto 0 do
  begin
    AText := '';
    if AHasButton and (I = ALevel) then
    begin
      AText := ButtonTexts[ARow.Expanded];
      AStyle := GetExpandButtonParams(AGridLines);
    end
    else
    begin
      if ARow is TcxGridGroupRow then
        Styles.GetGroupParams(ARow, I, AViewParams)
      else
        Styles.GetContentParams(ARow, nil, AViewParams);
      ViewParamsToExportStyle(AViewParams, AStyle, taLeftJustify, AGridLines - [bTop], GridLineColor);
    end;
    ARow := ARow.ParentRecord;
    AddVisualItemEx(R, AText, Provider.RegisterStyle(AStyle), False);
    OffsetRect(R, -ViewInfo.LevelIndent, 0);
  end;
  Result := (ALevel + 1) * ViewInfo.LevelIndent;
end;

procedure TcxGridTableViewExport.AddMasterDataRow(
  var ATop, ALeft: Integer; ARow: TcxGridMasterDataRow);
var
  ABounds: TRect;
begin
  AddDataRow(ATop, ALeft, ARow);
  if not ARow.Expanded or not InternalProviderSupported then Exit;
  ALeft := AddIndents(ATop, DefaultRowHeight, ARow, False, ARow.Level);
  ABounds := Rect(ALeft, ATop, RecordWidth, ATop + DefaultRowHeight);
  with AddVisualDataItem(ABounds, DefaultStyleIndex, ARow, nil) do
    Hidden := True;
  ATop := ABounds.Bottom;
end;

procedure TcxGridTableViewExport.AddRowFooter(
  var ATop, ALeft: Integer; ADataLevel, ALevel: Integer; ARow: TcxCustomGridRecord);
var
  AValues: PVariant;
  AItems: TcxDataSummaryItems;
begin
  ALeft := 0;
  while ARow.Level > ADataLevel do
    ARow := ARow.ParentRecord;
  if DataController.Summary.GetGroupSummaryInfo(ARow.Index, AItems, AValues) then
  begin
    AddFooterCells(ATop, ALeft, TcxCustomGridRow(ARow),
      ALevel, ADataLevel, AItems, AValues, False);
  end; 
end;

procedure TcxGridTableViewExport.AddRowFooters(
  var ATop, ALeft: Integer; ARow: TcxCustomGridRecord);
var
  ALevel, ARealLevel: Integer;
begin
  for ALevel := 0 to ARow.Level do
  begin
    ARealLevel := ALevel;
    if HasFooter(ARow, ARealLevel) then
      AddRowFooter(ATop, ALeft, ARealLevel, ARow.Level - ALevel, ARow);
  end;
end;

procedure TcxGridTableViewExport.AddRowPreview(
  var ATop, ALeft: Integer; ARow: TcxCustomGridRecord);
var
  R: TRect;
  AColumn: TcxGridColumn;
  AParams: TcxViewParams;
begin
  AColumn := GridView.Preview.Column;
  AColumn.Styles.GetContentParams(ARow, AParams);
  R := Rect(ALeft, ATop, RecordWidth, ATop + GetPreviewHeight(ARow));
  AddVisualItemEx(R, VarToStr(GetViewItemValue(ARow, AColumn)), AParams,
    AColumn.GetProperties.Alignment.Horz, GridLines, GridLineColor);
  ATop := R.Bottom;
end;

function TcxGridTableViewExport.AddVisualItem(
  AItemClass: TcxExportVisualItemClass; const ABounds: TRect): TcxExportVisualItem;
begin
  Result := AItemClass.Create();
  Result.Style := -1;
  Result.Bounds := ABounds;
  with ABounds do
  begin
    Columns.AddPairs(Left, Right);
    Rows.AddPairs(Top, Bottom);
  end;
  with VisualItemsList do 
    if Capacity - Count < 2 then Capacity := Count * 2;
  VisualItemsList.Add(Result);
end;

function TcxGridTableViewExport.AddVisualDataItem(
  const AItemBounds: TRect; AStyle: Integer; 
  ARecord: TcxCustomGridRecord; AColumn: TcxGridColumn): TcxExportVisualItem;
begin
  Result := AddVisualItem(TcxExportVisualItem, AItemBounds);
  Result.Style := AStyle;
  Result.Data := ARecord;
  Result.Data2 := AColumn;
end;

function TcxGridTableViewExport.AddVisualItemEx(
  const AItemBounds: TRect; const ADisplayText: string; const AViewParams: TcxViewParams;
  AAlignment: TAlignment; ABorders: TcxBorders; ABorderColor: TColor = clDefault;
  AIsBackground: Boolean = False): TcxExportVisualItem;
var
  ASide: TcxBorder;
  AStyle: TcxCacheCellStyle;
begin
  ViewParamsToExportStyle(AViewParams, AStyle, AAlignment);
  if ABorderColor <> clDefault then
  begin
    ABorderColor := ColorToRgb(ABorderColor);
    for ASide := bLeft to bBottom do
      if ASide in ABorders then
      begin
        AStyle.Borders[Integer(ASide)].IsDefault := False;
        AStyle.Borders[Integer(ASide)].Color := ABorderColor;
        AStyle.Borders[Integer(ASide)].Width := 1;
      end;
  end;
  Result := AddVisualItemEx(AItemBounds, ADisplayText,
    Provider.RegisterStyle(AStyle), AIsBackground);
end;

function TcxGridTableViewExport.AddVisualItemEx(
  const AItemBounds: TRect; const ADisplayText: string;
  AStyle: Integer; AIsBackground: Boolean = False): TcxExportVisualItem;
begin
  Result := AddVisualItem(TcxExportVisualItem, AItemBounds);
  Result.Bounds := AItemBounds;
  Result.IsBackground := AIsBackground;
  Result.DisplayText := ADisplayText;
  Result.Style := AStyle;
end;

function TcxGridTableViewExport.AddPattern(const ABounds: TRect;
  AData: TObject; AOffset: Integer = 0): TcxExportVisualItem;
begin
  Result := TcxExportVisualItem.Create;
  Result.Bounds := ABounds;
  Result.Data := AData;
  Result.Data2 := TObject(AOffset);
  PatternsList.Add(Result);
end;

function TcxGridTableViewExport.CanShowMultiSummaries(AIsFooter: Boolean): Boolean;
begin
  if AIsFooter then 
    Result := OptionsView.CanShowFooterMultiSummaries
  else
    Result := OptionsView.CanShowGroupFooterMultiSummaries;
end;

procedure TcxGridTableViewExport.CreateContent(var ATop, ALeft: Integer);
var
  I: Integer;
  ARow: TcxCustomGridRecord;
begin
  for I := 0 to RecordCount - 1 do
  begin
    ALeft := 0;
    ARow := Records[I];
    if ARow is TcxGridGroupRow then
      AddGroupRow(ATop, ALeft, TcxGridGroupRow(ARow))
    else
      if ARow is TcxGridMasterDataRow then
        AddMasterDataRow(ATop, ALeft, TcxGridMasterDataRow(ARow))
      else
        if ARow is TcxGridDataRow then
          AddDataRow(ATop, ALeft, TcxGridDataRow(ARow));
    AddRowFooters(ATop, ALeft, ARow);
  end;
end;

procedure TcxGridTableViewExport.CreateFooter(var ATop, ALeft: Integer);
begin
  if not OptionsView.Footer then Exit;
  AddFooterCells(ATop, ALeft, nil, 0, -1,
    DataController.Summary.FooterSummaryItems, nil, True);
end;

procedure TcxGridTableViewExport.CreateHeader(var ATop, ALeft: Integer);
begin
  FRecordWidth := ViewInfo.DataWidth;
  ProduceHeadersContainer(ATop, ALeft, ViewInfo.HeaderViewInfo);
end;

procedure TcxGridTableViewExport.CreateExportCells;
var
  ATop, ALeft: Integer; 
begin
  ATop := 0;
  ALeft := 0;
  CreateHeader(ATop, ALeft);
  CreateContent(ATop, ALeft);
  ALeft := 0;
  CreateFooter(ATop, ALeft);
  MergeCells;
end;

procedure TcxGridTableViewExport.CreateRecordFromPattern(
  var ATop, ALeft: Integer; ARecord: TcxCustomGridRecord);
var
  R: TRect;
  I: Integer;
  APattern: TcxExportVisualItem;
  AViewParams: TcxViewParams;
  AStyle: TcxCacheCellStyle; 
begin
  for I := 0 to PatternCount - 1 do
  begin
    APattern := Patterns[I];
    R := APattern.GetBoundsRelativeTo(ATop, ALeft);
    if APattern.IsColumn then
    begin
      AStyle := GetContentParams(ARecord, TcxGridColumn(APattern.Data),
        AViewParams, GridLines, GridLineColor);
      AddVisualDataItem(R, Provider.RegisterStyle(AStyle), ARecord, TcxGridColumn(APattern.Data));
    end
    else
      AddVisualItemEx(R, '', GetPatternParams(ARecord, APattern), taLeftJustify, [], clDefault, True);
  end;
end;

function TcxGridTableViewExport.DoMergeCell(
  AMasterItem, ASlaveItem: TcxExportVisualItem): Boolean;
var
  AColumn: TcxGridColumn;
  AMasterValue, ASlaveValue: Variant;
  AMasterProperties, ASlaveProperties: TcxCustomEditProperties; 
begin
  Result := AMasterItem <> ASlaveItem;
  with AMasterItem.Bounds do
  begin
    Result := Result and not TcxGridDataRow(AMasterItem.Data).Expanded and
      (Bottom = ASlaveItem.Bounds.Top) and (Left = ASlaveItem.Bounds.Left) and
      (Right = ASlaveItem.Bounds.Right);
  end;
  if Result then
  begin
    AColumn := TcxGridColumn(AMasterItem.Data2);
    AMasterValue := GetViewItemValueEx(
      TcxGridDataRow(AMasterItem.Data), AColumn, AMasterProperties);
    ASlaveValue := GetViewItemValueEx(
      TcxGridDataRow(ASlaveItem.Data), AColumn, ASlaveProperties);
    Result := AColumn.DoCompareValuesForCellMerging(TcxGridDataRow(AMasterItem.Data), AMasterProperties,
      AMasterValue, TcxGridDataRow(ASlaveItem.Data), ASlaveProperties,  ASlaveValue);
  end;
  if Result then
  begin
    AMasterItem.Bounds.Bottom := ASlaveItem.Bounds.Bottom;
    ASlaveItem.Hidden := True;
    ASlaveItem.Slave := True;
  end;
end;

procedure TcxGridTableViewExport.ExportCells;
var
  R: TRect;
  I: Integer;
  AItem: TcxExportVisualItem;
begin
  inherited ExportCells;
  R := Rect(0, 0, Columns.Count - 1, Rows.Count - 1);
  for I := 0 to VisualItemCount - 1 do
  begin
    AItem := VisualItems[I];
    if AItem.Slave then Continue; 
    if AItem.Hidden then
    begin
      if AItem.Data is TcxGridMasterDataRow and TcxGridMasterDataRow(AItem.Data).Expanded then
        ExportDetailCell(AItem);
      Continue;
    end;
    if AItem.IsBackground then
      FillRealArea(AItem.Bounds, AItem.Style, clBtnShado

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?