Спасибо за советы, qpi и HunterNS. Но нужно больше ориентироваться не на Cell0, а на Row2 - Row4:
Счётчик по ячейкам заголовков строк (столбцы 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))
Сейчас попробую реализовать единое событие <!--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;
красится третья строка и последние три столбца
а при
if HeaderIndexes[3] = 2 then Memo.Color := clRed;
не красится ничего (я думал, что должны покраситься 4 и 5 столбцы в третьих строках)?
Сейчас попробую реализовать единое событие <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->dbcRow2OnAfterPrint<!--fontc--></span><!--/fontc--> для трёх столбцов.
Сделал то, что хотел. Спасибо большое 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-->пока не думал. Если есть предложения, то подскажите, пожалуйста.
Код перестаёт работать, когда поле заголовка строки объединённое:
Тогда возникает следующий вопрос: как FastReport проходит ячейки заголовка? Построчно или первый уровень заголовка (все его строки), потом второй заголовка (все его строки) и т.д.? Как узнать, что поле заголовка является объединённым?
Правильно ли я понимаю адресацию и обход полей заголовков строк:
Что значит свойство <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTab.GroupIndex<!--fontc--></span><!--/fontc-->?
Ответьте, пожалуйста, как пройти правильно все поля заголовков в <!--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-->? Спасибо.
Комментарии
Счётчик по ячейкам заголовков строк (столбцы 2 - 4) вроде организовал: Но как в массив записывать максимальное значение Memo.CalcHeight из трёх столбцов не пойму. Пробую уже разные подходы, но всё не то. Плюс нужно учитывать, что строка не итоговая:
Ещё такой вопрос: для каждого столбца сперва возникает <!--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-->? Или как-то ещё?
И ещё один: почему при записи красится третья строка и последние три столбца
а при не красится ничего (я думал, что должны покраситься 4 и 5 столбцы в третьих строках)?
Вот код, в котором регулирую высоту строк в <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTab<!--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-->TStringList<!--fontc--></span><!--/fontc-->. Предполагаю, чтобы этого не было, нужно по-другому сделать: Но как высчитать <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->LastRowInFirstLevel <!--fontc--></span><!--/fontc-->пока не думал. Если есть предложения, то подскажите, пожалуйста.
Тогда возникает следующий вопрос: как FastReport проходит ячейки заголовка? Построчно или первый уровень заголовка (все его строки), потом второй заголовка (все его строки) и т.д.? Как узнать, что поле заголовка является объединённым?
Правильно ли я понимаю адресацию и обход полей заголовков строк:
Что значит свойство <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTab.GroupIndex<!--fontc--></span><!--/fontc-->?