Ehlib的打印问题(200分)

  • 主题发起人 主题发起人 mblk
  • 开始时间 开始时间
M

mblk

Unregistered / Unconfirmed
GUEST, unregistred user!
在用PrintDBGridEh属性定义报表的标题等内容时,只在第一页能打印出来,
如何使 PrintDBGridEh 属性所定义的内容(包括标题和页眉)在每页都能打印出来?
如能用其它方法实现也行。
 
设置
PageHeader.CenterText 页眉中间的文本
PageHeader.LeftText 页眉左的文本
PageHeader.RightText 页眉右的文本

PageFooter.CenterText 页脚中间的文本
PageFooter.LeftText 页脚左的文本
PageFooter.RightText 页脚右的文本

//------------------------------------------------------------------------------
//EhLib打印变量
//'&[Page]','&[ShortDate]','&[Date]','&[LongDate]','&[Time]','&[Pages]'
//------------------------------------------------------------------------------
 
在PageHeader里定义的可以每页都有
 
PageHeader里不能定义字体大小
 
PageHeader里不能定义字体大小
 
PageHeader里有Font属性嘛
 
PageHeader的Font属性定义后, 标题和页眉都一样大
 
PageHeader的Font属性定义后, 标题和页眉都一样大
 
我是菜鸟,这个控件再那里啊?
 
没办法,自己改吧,我就这样改过一回,可惜新版本一出又老样子了,真繁
 
zjjzl,告诉我如何改, 我可以给你再加500分.
 
按照我用的方法很繁,而且使得[&Page]、[&Pages]这两个功能用不了,
现在我又看了一下Ehlib2.0的源代码,觉得可以这样试试:
修改过程PrintTo中的子过程:
procedure PrintOutInfo;
begin
PrintRichText(TRichEditStrings(BeforeGridText));
if PrintOffset >= DataPrintRec.Bottom - DataPrintRec.Top then
begin
VPrinter_NewPage;
PrintOffset := 0;
end;

InitPolyBookmark(PBm1);
while True do begin
PBm2 := CalcPrintRows(PBm1, DataPrintRec.Top + PrintOffset, DataPrintRec.Bottom);
PrintOffset := DrawRowsRange(PBm1,PBm2) + PenW;
if (PBm2.EOF = True)
then Break
else PrintOffset := 0;
PBm1 := PBm2;
end;

VPrinter_Canvas.BRUSH.Style := bsClear;
VPrinter_Canvas.Brush.Color := clWhite;

PrintRichText(TRichEditStrings(AfterGridText));
end;

为:

procedure PrintOutInfo;
var
richh : integer;
saveCalcInfoMode:boolean;
begin
//首先必须保证beforetext与aftertext两者高度不得超过DataPrintRec的高度,否则将陷入死循环;
saveCalcInfoMode:=CalcInfoMode;
CalcInfoMode := True;
PrintRichText(TRichEditStrings(AfterGridText));
richh:=PrintOffset;
PrintOffset:=0;
PrintRichText(TRichEditStrings(BeforeGridText));
CalcInfoMode := saveCalcInfoMode;
if PrintOffset + richh >= DataPrintRec.Bottom - DataPrintRec.Top { +Grid的最小高度 } then
此处加入发出错误信息代码
PrintOffset:=0;



InitPolyBookmark(PBm1);
while True do begin
PrintRichText(TRichEditStrings(BeforeGridText));
PBm2 := CalcPrintRows(PBm1, DataPrintRec.Top + PrintOffset, DataPrintRec.Bottom-richh - PenW);
PrintOffset := DrawRowsRange(PBm1,PBm2) + PenW;
PrintRichText(TRichEditStrings(AfterGridText));

if (PBm2.EOF = True)
then Break
else PrintOffset := 0;
PBm1 := PBm2;
end;

VPrinter_Canvas.BRUSH.Style := bsClear;
VPrinter_Canvas.Brush.Color := clWhite;

end;
 
zjjzl,还是不行。第一页显示两个beforetext所定义的标题,第二页没有
 
应该是最后一页没有

procedure PrintOutInfo;
var
richh,brichh : integer; //**
saveCalcInfoMode:boolean;
begin
//首先必须保证beforetext与aftertext两者高度不得超过DataPrintRec的高度,否则将陷入死循环;
saveCalcInfoMode:=CalcInfoMode;
CalcInfoMode := True;
PrintRichText(TRichEditStrings(AfterGridText));
richh:=PrintOffset;
PrintOffset:=0;
PrintRichText(TRichEditStrings(BeforeGridText));
brichh:=PrintOffset;//**
PrintOffset:=0; //**
CalcInfoMode := saveCalcInfoMode;
if brichh + richh >= DataPrintRec.Bottom - DataPrintRec.Top { +Grid的最小高度 } then
此处加入发出错误信息代码



InitPolyBookmark(PBm1);
while True do begin
PBm2 := CalcPrintRows(PBm1, DataPrintRec.Top + brichh { *** } , DataPrintRec.Bottom-richh - PenW);
PrintOffset := DrawRowsRange(PBm1,PBm2) + PenW;
PrintRichText(TRichEditStrings(AfterGridText));
PrintOffset := 0; //**
PrintRichText(TRichEditStrings(BeforeGridText));//**
if (PBm2.EOF = True)
then Break
else PrintOffset := 0;

PBm1 := PBm2;
end;

VPrinter_Canvas.BRUSH.Style := bsClear;
VPrinter_Canvas.Brush.Color := clWhite;

end;

请尽快试试,我在等,
在的话给个回音,我这边代码另外改的试不了。
 
zjjzl,现在倒是有了。但PageHeader和beforetext所定义的标题都打印到报表中去了
 
PBm2 := CalcPrintRows(PBm1, DataPrintRec.Top + brichh { *** } , DataPrintRec.Bottom-richh - PenW);
PrintOffset := DrawRowsRange(PBm1,PBm2) + PenW;
PrintRichText(TRichEditStrings(AfterGridText));
前加入:


PrintOffset:=brichh;
 
Pageheader不会吧,是的话,发一个图片过来,zjjzl@mail.jxptt.zj.cn
 
zjjzl,谢谢你,打印预览基本上成功了,150% 预览时最上面一行表格线被覆盖。其它各种
预览都正常。打印我正在试。
 
zjjzl,对不起,打印机出了一点问题,今晚试不成了。成功后一定给你加分。上面提到的
预览问题能否再帮助解决?
 
后退
顶部