Как сделать "навороченную шапку"?

2»

Комментарии

  • TopCoreTopCore Мариуполь
    отредактировано 01:26
    Спасибо за советы, qpi и HunterNS. Но нужно больше ориентироваться не на Cell0, а на Row2 - Row4:
    wwkB4UfR.png
    Счётчик по ячейкам заголовков строк (столбцы 2 - 4) вроде организовал:
    procedure dbcOnPrintRowHeader(Memo: TfrxMemoView; HeaderIndexes, HeaderValues, Value: Variant);
    begin
      if not Engine.FinalPass then begin
        // Счётчик полей заголовков строк (первые два столбика не учитываются).
        if (colIndx = 4) then begin
          colIndx := 2;
          rowIndx := rowIndx + 1;
        end
        else
          colIndx := colIndx + 1;
      end;
    end;
    
    Но как в массив записывать максимальное значение Memo.CalcHeight из трёх столбцов не пойму. Пробую уже разные подходы, но всё не то. Плюс нужно учитывать, что строка не итоговая:
    (not dbc.IsTotalRow(rowIndx)) or (not dbc.IsGrandTotalRow(rowIndx))
    
  • TopCoreTopCore Мариуполь
    отредактировано July 2011
    Сейчас попробую реализовать единое событие <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->dbcRow2OnAfterPrint<!--fontc--></span><!--/fontc--> для трёх столбцов.

    Ещё такой вопрос: для каждого столбца сперва возникает <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->dbcOnPrintRowHeader<!--fontc--></span><!--/fontc-->, а потом <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->dbcRowOnAfterPrint<!--fontc--></span><!--/fontc-->? Или сперва все <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->OnAfterPrint<!--fontc--></span><!--/fontc-->`ы, а потом <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->dbcOnPrintRowHeader<!--fontc--></span><!--/fontc-->? Или как-то ещё?

    И ещё один: почему при записи
    if HeaderIndexes[2] = 2 then Memo.Color := clRed;
    
    красится третья строка и последние три столбца
    VN15F72v.png
    а при
    if HeaderIndexes[3] = 2 then Memo.Color := clRed;
    
    не красится ничего (я думал, что должны покраситься 4 и 5 столбцы в третьих строках)?
  • TopCoreTopCore Мариуполь
    отредактировано 01:26
    TopCore написал: »
    Сейчас попробую реализовать единое событие <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->dbcRow2OnAfterPrint<!--fontc--></span><!--/fontc--> для трёх столбцов.
    Этот способ малосовместим с жизнью.
  • TopCoreTopCore Мариуполь
    отредактировано 01:26
    Сделал то, что хотел. Спасибо большое qpi и HunterNS!
    Вот код, в котором регулирую высоту строк в <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTab<!--fontc--></span><!--/fontc-->:
    var
      dbcRowsHeightList: TStringList;
      RowIndex, RowIndexInGroup, ColIndex: Integer;
      CellHeaderHeight: Extended;
    
    procedure frxReport_ShopObjectOnStartReport(Sender: TfrxComponent);
    begin
      dbcRowsHeightList := TStringList.Create;
    end;
    
    procedure Page1OnBeforePrint(Sender: TfrxComponent);
    begin
      RowIndex := 0;
      RowIndexInGroup := 0;
      CellHeaderHeight := 0;
    end;
    
    procedure dbcOnPrintRowHeader(Memo: TfrxMemoView; HeaderIndexes, HeaderValues, Value: Variant);                                
    begin
      if not Engine.FinalPass then begin
        // Если высота текущго поля заголовка строки больше предыдущей,
        // то запоминаем эту высоту.
        if Memo.CalcHeight > CellHeaderHeight then
          CellHeaderHeight := Memo.CalcHeight;
    
        // Если текущее поле последнее в заголовке строки, то добавляем в
        // TStringList эту высоту. Обнуляем переменную с макимальной высотой строки.
        if HeaderIndexes[dbc.RowLevels - 1] = 0 then begin
          dbcRowsHeightList.Add(FloatToStr(CellHeaderHeight));
          CellHeaderHeight := 0;
          Inc(RowIndex);
          Inc(RowIndexInGroup);
        end;
    
        // Если находимся на строке промежуточного итога, то просто записываем высоту строки как есть.
        if (HeaderIndexes[2] = RowIndexInGroup) and (dbc.IsTotalRow(RowIndex)) then begin
          dbcRowsHeightList.Add(FloatToStr(Memo.CalcHeight));
          Inc(RowIndex);
          RowIndexInGroup := 0;
        end;
    
        // Если находимся на строке итогов, то записываем высоту как есть. Но тут RowIndex должен
        // быть отличный от данного!!!!!
        if dbc.IsGrandTotalRow(RowIndex) then
          dbcRowsHeightList.Add(FloatToStr(Memo.CalcHeight));
      end;
    end;
    
    procedure dbcOnCalcHeight(RowIndex: Integer; RowValues: Variant; var Height: Extended);
    begin
      if Engine.FinalPass then begin
        Height := StrToFloat(dbcRowsHeightList[RowIndex]);
      end;
    end;
    
    procedure frxReport_ShopObjectOnStopReport(Sender: TfrxComponent);
    begin
      dbcRowsHeightList.Free;
    end;
    
    begin
    end.
    
    Есть одна мелочь в коде: последнее условие в <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->dbcOnPrintRowHeader<!--fontc--></span><!--/fontc--> даёт две строки в <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->TStringList<!--fontc--></span><!--/fontc-->. Предполагаю, чтобы этого не было, нужно по-другому сделать:
    if (HeaderIndexes[0] = LastRowInFirstLevel) then
      dbcRowsHeightList.Add(FloatToStr(Memo.CalcHeight));
    
    Но как высчитать <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->LastRowInFirstLevel <!--fontc--></span><!--/fontc-->пока не думал. Если есть предложения, то подскажите, пожалуйста.
  • TopCoreTopCore Мариуполь
    отредактировано July 2011
    Код перестаёт работать, когда поле заголовка строки объединённое:
    R8TYXQeU.png
    Тогда возникает следующий вопрос: как FastReport проходит ячейки заголовка? Построчно или первый уровень заголовка (все его строки), потом второй заголовка (все его строки) и т.д.? Как узнать, что поле заголовка является объединённым?
    Правильно ли я понимаю адресацию и обход полей заголовков строк:
    CAg3yMV7.png
    eOt7T9sV.png
    Что значит свойство <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTab.GroupIndex<!--fontc--></span><!--/fontc-->?
  • TopCoreTopCore Мариуполь
    отредактировано 01:26
    Ответьте, пожалуйста, как пройти правильно все поля заголовков в <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->OnPrintRowHeader<!--fontc--></span><!--/fontc-->. Откуда мне брать правильно номер уровня и номер строки для <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->HeaderIndexes<!--fontc--></span><!--/fontc-->? Спасибо.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.