добавления пустых строк при печати Databand

отредактировано 16:49 Раздел: FastReport 4.0
Если в DataBand установить свойство RowCount>0 то, при привязке бэнда к Dataset,
происходит ограничение на количество выводимых строк, лучше бы было бы сделать
добавление пустых строк, если число выведенных строк < RowCount, а еще лучше
добавить 2 параметра MaxRowCount и MinRowCount, а то приходится такой огород
городить особенно если на бэнде несколько колонок.

Ниже приведены изменения в frxEngine для добавления пустых строк,

со строки 1046

{ Band tree is the structure that we created in the PreparePage method }
procedure ShowBandTree(Obj: TObject);
var
i: Integer;
Bands: TList;
b: TfrxDataBand;
FirstTime: Boolean;
FooterKeepPos, ColumnKeepPos: Integer;
SaveCurY: Extended;

Procedure ShowData;
begin
if FirstTime then
begin
if b.KeepTogether then
StartKeep( :) ;
if b.KeepHeader and (b.FHeader <> nil) then
StartKeep( :) ;
AddToHeaderList(b.FHeader);
ShowBand(b.FHeader);
end
{ keeping a master-detail differs from keeping a group }
else if (b.FGroup = nil) and b.KeepTogether then
StartKeep( :) ;

if b.FGroup <> nil then
if FirstTime then
InitGroups(b, TfrxGroupHeader(b.FGroup), 0, True) else
CheckGroups(b, TfrxGroupHeader(b.FGroup), ColumnKeepPos, SaveCurY);

if b.KeepFooter then
FooterKeepPos := PreviewPages.GetCurPosition;
if (b.Columns > 1) and (b.CurColumn = 1) then
ColumnKeepPos := PreviewPages.GetCurPosition;

SaveCurY := CurY;
CurLine := b.FLineN;
CurLineThrough := b.FLineThrough;
ShowBand( :) ;
NotifyObjects( :) ;

if FirstTime then
if b.KeepHeader and (b.FHeader <> nil) then
EndKeep( :) ;
FirstTime := False;

Inc(b.FLineN);
Inc(b.FLineThrough);
CheckBandColumns(b, ColumnKeepPos, SaveCurY);
end;

Procedure ShowZerobands;
var
t: tfrxComponent;
n: integer;
list: tStringList;
begin
if (b.RowCount <> 0) and (b.FLineN <= b.RowCount) then
begin
list := tStringList.Create;
for n := 0 to b.Objects.Count - 1 do
begin
t := b.Objects[n];
if t is tfrxMemoView then
begin
list.Add(tfrxMemoView(t).DataField+'='+tfrxMemoView(t).Text);
tfrxMemoView(t).DataField := '';
tfrxMemoView(t).Text := '';
end;
end;
for n := 0 to b.RowCount-b.FLineN do
begin
ShowData;
FIsFirstBand := False;
if b.FooterAfterEach then
ShowBand(b.FFooter);
{ keeping a master-detail differs from keeping a group }
if (b.FGroup = nil) and b.KeepTogether then
EndKeep( :) ;
end;
{Восстанавливаем значения, Хотя возможно это и не нужно}
for n := 0 to b.Objects.Count - 1 do
begin
t := b.Objects[n];
if t is tfrxMemoView then
begin
tfrxMemoView(t).DataField := List.Names[n];
tfrxMemoView(t).Text := List.ValueFromIndex[n];
end;
end;
List.Free;
end;
end;

begin
Application.ProcessMessages;
if Report.Terminated then Exit;

FooterKeepPos := 0;
ColumnKeepPos := 0;
SaveCurY := CurY;
if Obj is TfrxReportPage then
Bands := TfrxReportPage(Obj).FSubBands else
Bands := TfrxBand(Obj).FSubBands;

for i := 0 to Bands.Count - 1 do
begin
b := Bands;
if b.DataSet = nil then
continue;
b.DataSet.First;
b.FLineN := 1;
b.FLineThrough := 1;
b.CurColumn := 1;
FirstTime := True;
ResetSuppressValues( :) ;

while not b.DataSet.Eof do
begin
if CanShow(b, b.PrintIfDetailEmpty) then
begin
ShowData; {кусок кода, который был выделен в процедуру ShowData}
AddBandOutline( :) ;
ShowBandTree( :) ;
OutlineUp( :) ;
end;

FIsFirstBand := False;

if b.FooterAfterEach then
ShowBand(b.FFooter);

{ keeping a master-detail differs from keeping a group }
if (b.FGroup = nil) and b.KeepTogether then
EndKeep( :) ;
b.DataSet.Next;

{!!!!!!!!!!!!!1 Убрал ограничение на вывод строк. Здесь возможна проверка на MaxRowCount
if b.RowCount <> 0 then
if b.FLineN > b.RowCount then break;
!!!!!!!!!!!!!}

if Report.Terminated then break;
end;

{!!!!!!! добавляем пустые строки }
ShowZeroBands;

{ update the CurY if band is multicolumn }
b.CurColumn := b.Columns;
CheckBandColumns(b, ColumnKeepPos, SaveCurY);

if not FirstTime then { some bands have been printed }
begin
if b.FGroup <> nil then
ShowGroupFooters(TfrxGroupHeader(b.FGroup), 0, :) ;

if not b.FooterAfterEach then
begin
if b.KeepFooter then
StartKeep(b, FooterKeepPos);
FKeepFooter := True;
ShowBand(b.FFooter);
if b.KeepFooter then
EndKeep( :) ;
FKeepFooter := False;
end;
RemoveFromHeaderList(b.FHeader);
if (b.FGroup <> nil) and b.KeepTogether then
EndKeep( :) ;
end;

if Report.Terminated then break;
FIsFirstBand := False;
end;
end;

Комментарии

  • отредактировано 16:49
    После того как изменили дизай сайта невозможно стало нормально вывести код.
    То вырезается часть кода, то рожи вставляются.
    В сообщениии выше вместо рож должна быть буква b.
    На всякий случай прикрепляю файл
  • отредактировано 16:49
    И в дополнение к Engine.
    Если в скрипте в onStartReport или в стартовой секции begin end,
    установить Report.Terminated=true, то ReportTitle всеравно печатается.
    В frxEngine нужно добавить 1 строку.
    Для пакетной печати это важно, если проверку проводить внутри отчета.

    ...
    function TfrxEngine.Run: Boolean;
    var
    i: Integer;
    begin
    Result := False;
    try
    if Initialize then
    try
    Report.DataSets.Initialize;
    Report.DoNotifyEvent(Report, Report.OnStartReport);

    if not Report.Terminated then //добавить проверку
    if RunDialogs then
    begin
    ....

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

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