добавления пустых строк при печати Databand
Если в 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;
происходит ограничение на количество выводимых строк, лучше бы было бы сделать
добавление пустых строк, если число выведенных строк < 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;
Комментарии
То вырезается часть кода, то рожи вставляются.
В сообщениии выше вместо рож должна быть буква b.
На всякий случай прикрепляю файл
Если в скрипте в 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
....