rm_cross.pas

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

PAS
2,297
字号
    begin
      THackUserDataset(FColumnDS).FRecordNo := FCross.TopLeftSize.cx;
      while not FColumnDS.EOF do
      begin
        maxw := 0;

        FRowDS.First;
        FRowDS.Next;
        while not FRowDS.EOF do
        begin
          ReportBeforePrint(nil, TRMReportView(v));
          m.Assign(v.Memo);
          if m.Count = 0 then
            m.Add(' ');
          w := THackMemoView(v).CalcWidth(m) + 5;
          if w > maxw then
            maxw := w;
          FRowDS.Next;
        end;
        if FColumnWidths.Cell[FColumnDS.RecordNo] < maxw then
          FColumnWidths.Cell[FColumnDS.RecordNo] := maxw;
        FColumnDS.Next;
      end;
      FColumnWidths.Cell[FCross.Columns.Count] := 0;
    end;

    FRowDS.First;
    for i := 0 to FCross.TopLeftSize.cy do
    begin
      maxh := 0;

      FColumnDS.First;
      while not FColumnDS.EOF do
      begin
        w := v.spWidth;
        v.spWidth := 1000;
        h := RMToScreenPixels(THackMemoView(v).CalcHeight, rmutMMThousandths);
        v.spWidth := w;
        if h > maxh then
          maxh := h;
        FColumnDS.Next;
      end;

      if (FHeaderHeight <> '') and (FHeaderHeight <> '0') then // WHF Modify
      begin
        FColumnHeights.Cell[i] := GetHeaderHeightByIndex(i);
      end
      else
      begin
        if maxh > v.spHeight then
          FColumnHeights.Cell[i] := maxh
        else
          FColumnHeights.Cell[i] := v.spHeight;
      end;
      FRowDS.Next;
    end;

    FColumnDS.First;
    while not FColumnDS.EOF do
    begin
      w := v.spWidth;
      v.spWidth := 1000;
      h := RMToScreenPixels(THackMemoView(v).CalcHeight, rmutMMThousandths);
      v.spWidth := w;
      if h > FMaxCellHeight then
        FMaxCellHeight := h;
      FColumnDS.Next;
    end;

    if ShowRowTotal or ShowColumnTotal then
    begin
      THackUserDataset(FRowDS).FRecordNo := FRowDS.RangeEndCount - 1;
      FColumnDS.First;
      while not FColumnDS.EOF do
      begin
        w := v.spWidth;
        v.spWidth := 1000;
        h := RMToScreenPixels(THackMemoView(v).CalcHeight, rmutMMThousandths);
        v.spWidth := w;
        if h > FMaxGTHeight then
          FMaxGTHeight := h;
        FColumnDS.Next;
      end;
    end;

    THackMemoView(v).DrawMode := rmdmAll;
    FreeAndNil(m);
    FreeAndNil(b);
  end;

  if FMaxCellHeight < FDefDy then
    FMaxCellHeight := FDefDY;
  if FMaxGTHeight < FDefDy then
    FMaxGTHeight := FDefDY;
  FFlag := False;
  FLastX := 0;
end;

procedure TRMCrossView.MakeBands;
var
  i, d, d1, dx, dh: Integer;
  lBandMasterHeader: TRMBandHeader;
  lBandMasterData: TRMBandMasterData;
  lBandCrossHeader: TRMBandCrossHeader;
  lBandCrossData: TRMBandCrossData;
  v, v1: TRMMemoView;
  lPage: TRMReportPage;
begin
  lPage := ParentPage;

  lBandMasterHeader := TRMBandHeader.Create; // master header
  lBandMasterHeader.ParentPage := lPage;
  lBandMasterHeader.Name := 'CrossHeader1' + Name;
  lBandMasterHeader.CrossDataSetName := 'ColumnDS' + Name;
  lBandMasterHeader.SetspBounds(0, 400, 0, FDefDY);
  lBandMasterHeader.ReprintOnNewPage := FRepeatCaptions;

  lBandMasterData := TRMBandMasterData.Create; // master data
  lBandMasterData.ParentPage := lPage;
  lBandMasterData.Name := 'CrossData1' + Name;
  lBandMasterData.SetspBounds(0, 500, 0, FDefDY);
  lBandMasterData.DataSetName := 'RowDS' + Name;
  lBandMasterData.CrossDataSetName := 'ColumnDS' + Name;
  lBandMasterData.Stretched := True;

  lBandCrossHeader := TRMBandCrossHeader.Create; // cross header
  lBandCrossHeader.ParentPage := lPage;
  lBandCrossHeader.Name := 'CrossHeader2' + Name;
  lBandCrossHeader.SetspBounds(lPage.spMarginLeft, 0, 60, FDefDY);
  lBandCrossHeader.ReprintOnNewPage := True;

  lBandCrossData := TRMBandCrossData.Create; // cross data
  lBandCrossData.ParentPage := lPage;
  lBandCrossData.Name := 'CrossData2' + Name;
  lBandCrossData.SetspBounds(500, 0, 60, FDefDY);

  d := lBandMasterData.spTop;
  dh := lBandMasterData.spHeight;
  for i := 0 to FCross.CellItemsCount - 1 do
  begin
    v := TRMMemoView.Create;
    v.ParentPage := lPage;
    v.Name := 'CrossMemo@' + IntToStr(i) + Name;
    v.SetspBounds(lBandCrossData.spLeft, d, lBandCrossData.spWidth, dh);
    inc(d, dh);
    lBandMasterData.spHeight := lBandMasterData.spHeight + dh;
  end;

  ParentReport.CurrentPage := nil;
  CalcWidths;

  lBandMasterHeader.spHeight := 0;
  d := lBandMasterHeader.spTop;
  for i := 0 to FCross.TopLeftSize.cy - 1 + ord(FShowHeader) do // 交叉表数据栏 + 主项标头栏
  begin
    v := TRMMemoView.Create;
    v.ParentPage := lPage;
    dh := FColumnHeights.Cell[i + Ord(not FShowHeader)];
    v.SetspBounds(lBandCrossData.spLeft, d, lBandCrossData.spWidth, dh);
    v.Name := 'CrossMemo_' + IntToStr(i) + Name;
    lBandMasterHeader.spHeight := lBandMasterHeader.spHeight + dh;
    Inc(d, dh);
  end;

  lBandMasterData.spTop := lBandMasterHeader.spTop + lBandMasterHeader.spHeight + 30;
  lBandMasterData.spHeight := FMaxCellHeight * FCross.CellItemsCount;
  dh := FMaxCellHeight;
  d := lBandMasterData.spTop;
  for i := 0 to FCross.CellItemsCount - 1 do // 交叉表数据栏 + 主项数据栏
  begin
    v := TRMMemoView(ParentReport.FindObject('CrossMemo@' + IntToStr(i) + Name));
    v.ParentPage := lPage;
    v.spTop := d;
    v.spHeight := dh;
    inc(d, dh);
  end;

  lBandCrossHeader.spWidth := 0;
  d := lBandCrossHeader.spLeft;
  for i := 0 to FCross.TopLeftSize.cx - 1 do // 交叉表标头栏 + 主项数据栏
  begin
    v := TRMMemoView.Create;
    v.ParentPage := lPage;
    if (FHeaderWidth = '') or (FHeaderWidth = '0') then
      dx := FColumnWidths.Cell[i]
    else
      dx := GetHeaderWidthByIndex(i);
    v.SetspBounds(d, lBandMasterData.spTop, dx, lBandMasterData.spHeight);
    v.Name := 'CrossMemo' + IntToStr(i) + Name;
    lBandCrossHeader.spWidth := lBandCrossHeader.spWidth + dx;
    Inc(d, dx);
  end;

  if ShowIndicator or FShowHeader then
  begin
    v1 := TRMMemoView(lPage.FindObject('CrossHeaderMemo' + Name));
    if v1 <> nil then
    begin
      d := 0;
      for i := 0 to FCross.TopLeftSize.cy - 1 do
      begin
        d := d + FColumnHeights.Cell[i + Ord(not FShowHeader)];
      end;

      v := TRMMemoView.Create;
      v.ParentPage := lPage;
      v.Name := 'IndicatorMemo0' + Name;
      v.SetspBounds(lBandCrossHeader.spLeft, lBandMasterHeader.spTop, 0, lBandMasterHeader.spHeight);
      v.LeftFrame.Visible := True;
      v.RightFrame.Visible := True;
      v.TopFrame.Visible := True;
      v.BottomFrame.Visible := True;

      v.spHeight := d;
      v.spWidth := 0;
      for i := 0 to FCross.TopLeftSize.cx - 1 do
      begin
        if (FHeaderWidth = '') or (FHeaderWidth = '0') then
          v.spWidth := v.spWidth + FColumnWidths[i]
        else
          v.spWidth := v.spWidth + GetHeaderWidthByIndex(i);
      end;

      THackMemoView(v).FFlags := THackMemoView(v1).FFlags;
      THackMemoView(v).IsChildView := False;
      v.RotationType := TRMMemoView(v1).RotationType;
      v.LeftFrame.Assign(v1.LeftFrame);
      v.RightFrame.Assign(v1.RightFrame);
      v.TopFrame.Assign(v1.TopFrame);
      v.BottomFrame.Assign(v1.BottomFrame);
      v.FillColor := v1.FillColor;
      THackMemoView(v).FDisplayFormat := THackMemoView(v1).FDisplayFormat;
      THackMemoView(v).FormatFlag := THackMemoView(v1).FormatFlag;
      v.spGapLeft := TRMMemoView(v1).spGapLeft;
      v.spGapTop := TRMMemoView(v1).spGapTop;
      v.Highlight.Assign(TRMMemoView(v1).Highlight);
      v.LineSpacing := TRMMemoView(v1).LineSpacing;
      v.CharacterSpacing := TRMMemoView(v1).CharacterSpacing;
      v.Font.Assign(TRMMemoView(v1).Font);
      v.Memo.Assign(v1.Memo);
      v.HAlign := TRMMemoView(v1).HAlign;
      v.VAlign := TRMMemoView(v1).VAlign;
    end;
  end;

  if FShowHeader then
  begin
    d := lBandMasterHeader.spTop;
    for i := 0 to FCross.TopLeftSize.cy - 1 do
      d := d + FColumnHeights.Cell[i];

    d1 := lBandCrossHeader.spLeft;
    dh := FColumnHeights.Cell[FCross.TopLeftSize.cy];
    for i := 0 to FCross.TopLeftSize.cx - 1 do
    begin
      v := TRMMemoView.Create;
      v.ParentPage := lPage;
      if (FHeaderWidth = '') or (FHeaderWidth = '0') then
        dx := FColumnWidths.Cell[i]
      else
        dx := GetHeaderWidthByIndex(i);
      v.SetspBounds(d1, d, dx, dh);
      v.Name := 'CrossMemo~' + IntToStr(FCross.TopLeftSize.cy) + '~' + IntToStr(i) + Name;
      Inc(d1, dx);
    end;
  end;
end;

procedure TRMCrossView.ReportPrintColumn(ColNo: Integer; var Width: Integer);
var
  i: Integer;
  lCurView: TRMView;
begin
  lCurView := ParentReport.CurrentView;
  if not FSkip and (Pos(Name, lCurView.Name) <> 0) then
  begin
    if FDataWidth <= 0 then
      Width := FColumnWidths.Cell[ColNo - 1 + FCross.TopLeftSize.cx]
    else
      Width := FDataWidth;

    for i := 0 to FCRoss.CellItemsCount - 1 do
      ParentReport.FindObject('CrossMemo@' + IntToStr(i) + Name).spWidth := Width;

    if FRowDS.RecordNo < FCross.TopLeftSize.cy then
    begin
      for i := 0 to FCross.TopLeftSize.cy - 1 do
        ParentReport.FindObject('CrossMemo_' + IntToStr(i) + Name).spWidth := Width;
    end;
  end;

  if Assigned(FSavedOnPrintColumn) then
    FSavedOnPrintColumn(ColNo, Width);
end;

function _GetString(S: string; N: Integer): string;
var
  i: Integer;
begin
  Result := '';
  for i := 1 to Length(S) do
  begin
    if S[i] = ';' then
      Dec(N)
    else if N = 1 then
      Result := Result + s[i]
    else if N = 0 then
      break;
  end;
end;

function _GetPureString(S: string; N: Integer): string;
var
  i: Integer;
begin
  Result := '';
  for i := 1 to Length(S) do
  begin
    if S[i] = ';' then
      Dec(N)
    else if N = 1 then
      Result := Result + s[i]
    else if N = 0 then
      break;
  end;
  Result := PureName1(Result);
end;

procedure TRMCrossView.ReportBeforePrint(aMemo: TStrings; aView: TRMReportView);
var
  v: Variant;
  s, s1: string;
  i, j, row, col, ColCount: Integer;
  hd: Boolean;
  lHAlign: TRMHAlign;
  lVAlign: TRMVAlign;
  v1: TRMMemoView;
  ft: Word;
  lCurPage: THackReportPage;
  lCurBand: TRMBand;

  procedure Assign(m1, m2: TRMMemoView);
  begin
    m1.RotationType := m2.RotationType;
    m1.FillColor := m2.FillColor;
    THackMemoView(m1).FDisplayFormat := THackMemoView(m2).FDisplayFormat;
    THackMemoView(m1).FormatFlag := THackMemoView(m2).FormatFlag;
    m1.spGapLeft := m2.spGapLeft;
    m1.spGapTop := m2.spGapTop;
    m1.Highlight.Assign(m2.Highlight);
    m1.LineSpacing := m2.LineSpacing;
    m1.CharacterSpacing := m2.CharacterSpacing;
    m1.Font := m2.Font;
    m1.HAlign := TRMMemoView(m2).HAlign;
    m1.VAlign := TRMMemoView(m2).VAlign;
  end;

begin
  lCurPage := THackReportPage(ParentReport.CurrentPage);
  lCurBand := ParentReport.CurrentBand;

  if (not FSkip) and (Pos('CrossMemo', aView.Name) = 1) and (Pos(Name, aView.Name) <> 0) then
  begin
    i := 0;
    row := FRowDS.RecordNo;
    col := FColumnDS.RecordNo;
    if not FFlag then
    begin
      while FRowDS.RecordNo <= FCross.TopLeftSize.cy do
        FRowDS.Next;
      while FColumnDS.RecordNo < FCross.TopLeftSize.cx do
        FColumnDS.Next;
      row := FRowDS.RecordNo;
      col := FColumnDS.RecordNo;
      if aView.Name <> 'CrossMemo@0' + Name then
      begin
        s := Copy(aView.Name, 1, Pos(Name, aView.Name) - 1);
        if s[10] in ['_', '@', '~'] then
        begin
          if s[10] = '@' then
            i := StrToInt(Copy(s, 11, 255))
          else if s[10] = '~' then
          begin
            Delete(s, 1, 10);
            row := StrToInt(Copy(s, 1, Pos('~', s) - 1));
            Delete(s, 1, Pos('~', s));
            col := StrToInt(s);
          end
          else
          begin
            row := StrToInt(Copy(s, 11, 255));
            if not FShowHeader then
              Inc(row);
          end;
        end
        else
          col := StrToInt(Copy(s, 10, 255));
      end;
    end
    else if aView.Name <> 'CrossMemo' + Name then
    begin
      s := Copy(aView.Name, 1, Pos(Name, aView.Name) - 1);
      if s[10] = '@' then
        i := StrToInt(Copy(s, 11, 255));
    end;

    if not FShowHeader and (Row = 0) then
      Inc(Row);
    if not FFlag then
    begin
      if row <= FCross.TopLeftSize.cy then
        aView.spHeight := FColumnHeights.Cell[Row];
      aView.Visible := True;
      if Col < FCross.TopLeftSize.cx then
      begin
        if (FHeaderWidth = '') or (FHeaderWidth = '0') then
          aView.spWidth := FColumnWidths.Cell[Col]
        else
          aView.spWidth := GetHeaderWidthByIndex(Col);
      end
      else if FDataWidth <= 0 then
        aView.spWidth := FColumnWidths.Cell[Col]
      else
        aView.spWidth := FDataWidth;
    end;

    Assign(TRMMemoView(aView), TRMMemoView(ParentReport.FindObject('CellMemo' + Name)));
    lHAlign := TRMMemoView(aView).HAlign;
    lVAlign := TRMMemoView(aView).VAlign;
    if FInternalFrame then
    begin
      aView.LeftFrame.Visible := True;
      aView.TopFrame.Visible := True;
      aView.RightFrame.Visible := True;
      aView.BottomFrame.Visible := True;
    end
    else
    begin
      aView.LeftFrame.Visible := True;
      aView.RightFrame.Visible := True;
      aView.TopFrame.Visible := False;
      aView.BottomFrame.Visible := False;
    end;

    if (row = FCross.TopLeftSize.cy + 1) and (col >= FCross.TopLeftSize.cx) then
    begin
      if (not aView.TopFrame.Visible) and (not aView.BottomFrame.Visible) and
        (aView.LeftFrame.Visible or aView.RightFrame.Visible) then
        aView.TopFrame.Visible := True;
    end;

    v := FCross.CellByIndex[row, col, -1];
    if v <> Null then
    begin
      aView.LeftFrame.Visible := (v and rmftLeft) = rmftLeft;
      aView.RightFrame.Visible := (v and rmftRight) = rmftRight;
      aView.TopFrame.Visible := (v and rm

⌨️ 快捷键说明

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