fastreport中如何使一条记录的某个字段如备注或图片字段打印在第二页上而其他字段打印在第一页上?(100分)

  • 主题发起人 主题发起人 yangkee
  • 开始时间 开始时间
Y

yangkee

Unregistered / Unconfirmed
GUEST, unregistred user!
如何使一条记录的某个字段如备注或图片字段打印在第二页上而其他字段打印在第一页上?
就象下面一样:
-----------------------------------------------
字段一
字段二
字段三
字段四
字段五
page1
------------------------------------------------

字段六 <图片>


page2
-------------------------------------------------
字段一
字段二
字段三
字段四
字段五
page3
------------------------------------------------

字段六 <图片>


page4
-------------------------------------------------
 
将字段一 ,字段二..,字段五放在MasterDataBand上,MasterDataBand->FormNewPage=TRUE
放一个ChildBand1,字段六放在这个ChildBand1上,ChildBand1的OnBeforePrint:
begin
NewPage
end
MasterDataBand->ChildBand=ChildBand1,OK
 
谢谢,我试一试
 
非常感谢,基本没有问题,这100分归你了!!!
不过还有点小问题:我是在fastreport中用ole来显示一个ole字段中存放的visio图形
虽然ole的Stretched设为false但图形还是被拉伸了,有没有办法?如何将第二页方向设置为landscape
而第一页方向还是portrait?
知道了答案马上给分!!
 
1.不清楚
2.无法实现。
 
第一个问题的原因找到了,只能修改源程:
implementation
var
PixPerInch: TPoint;
procedure TfrOLEView.Draw(Canvas: TCanvas);
var
Bmp: TBitmap;
function HimetricToPixels(const P: TPoint): TPoint;
begin
Result.X := MulDiv(P.X, PixPerInch.X, 2540);
Result.Y := MulDiv(P.Y, PixPerInch.Y, 2540);
end;

procedure DrawOLE;
var
S: TPoint;
R: TRect;
liViewSize: TPoint;
begin
with OleContainerdo
begin
if SizeMode <> smStretch then
begin
OleObjectInterface.GetExtent(DVASPECT_CONTENT, liViewSize);
S := HimetricToPixels(liViewSize);
if SizeMode = smScale then
begin
if dx * S.Y > dy * S.X then
begin
S.X := S.X * dy div S.Y;
S.Y := dy;
end
else
begin
S.Y := S.Y * dx div S.X;
S.X := dx;
end;
end;

if (SizeMode = smCenter) or (SizeMode = smScale) then
begin
R.Left := DRect.Left + (dx - S.X) div 2;
R.Top := DRect.Top + (dy - S.Y) div 2;
R.Right := R.Left + S.X;
R.Bottom := R.Top + S.Y;
end
else
if SizeMode = smClip then
begin
SetRect(R, DRect.Left, DRect.Top, DRect.Left + S.X, DRect.Top + S.Y);
IntersectClipRect(Canvas.Handle, DRect.Left, DRect.Top, DRect.Right, DRect.Bottom);
end;
if R.Left < DRect.Left then
R.Left := DRect.Left;
if R.Top < DRect.Top then
R.Top := DRect.Top;
if R.Right > DRect.Right then
R.Right := DRect.Right;
if R.Bottom > DRect.Bottom then
R.Bottom := DRect.Bottom;
end
else
SetRect(R, DRect.Left, DRect.Top, DRect.Right, DRect.Bottom);
OleDraw(OleContainer.OleObjectInterface, DVASPECT_CONTENT, Canvas.Handle, R);
end;
end;

begin
begin
Draw(Canvas);
CalcGaps;
OleContainer.Width := dx;
OleContainer.Height := dy;
with Canvasdo
begin
ShowBackground;
if (dx > 0) and (dy > 0) then
begin
with OleContainerdo
begin
if OleObjectInterface <> nil then
DrawOLE
// OleDraw(OleObjectInterface, DVASPECT_CONTENT, Canvas.Handle, DRect)
procedure Initialize;
var
DC: HDC;
begin
DC := GetDC(0);
PixPerInch.X := GetDeviceCaps(DC, LOGPIXELSX);
PixPerInch.Y := GetDeviceCaps(DC, LOGPIXELSY);
ReleaseDC(0, DC);
end;

initialization
Initialize;
 
谢谢!有问题再找你!!
 
whf,如能解决第二个问题,再送你100分!
 
有一种方法,在TfrReport的Onbegin
Page中可以修改:
procedure TForm1.frReport1begin
Page(pgNo: Integer);
begin
if pgNo div 2 = 1 then
begin
with frReport1.Pages[0]do
ChangePaper(pgSize, pgWidth, pgHeight, pgBin, poPortrait);
end
else
begin
with frReport1.Pages[0]do
ChangePaper(pgSize, pgWidth, pgHeight, pgBin, poLandscape);
end;
end;
 
改正:
pgNo div 2 =1 应该是 pgNo mod 2 = 1
 
后退
顶部