关于把表格中的数据,按文本方式打印,为何,标题总是与第一行数据重叠? 代码如下 ( 积分: 100 )

  • 主题发起人 FlyDayDream
  • 开始时间
F

FlyDayDream

Unregistered / Unconfirmed
GUEST, unregistred user!
QryPrn: Tadoquery
GRD :Tgrideh
procedure TfmPrn.PrnTxt;
const
LeftBlank=0;
//定义页边距,单位厘米
RightBlank=0;
TopBlank=0;
BottomBlank=0;
var
PointX,PointY:integer;
PointScale,PrintStep:integer;
s,fsValue:string;
x,y:integer;
i:integer;
begin

//获取当前打印机的分辨率
PointX:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/2.54);
PointY:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);
//根据打印机和屏幕的分辨率计算出从屏幕转换到打印机的比例
PointScale:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/Screen.PixelsPerInch+0.5);
//横向打印
printer.Orientation:=poPortrait;
//横打还是竖打-->竖打
//打印的字体和大小
printer.Canvas.Font.Name:='宋体';
printer.canvas.Font.Size:=18;
//Printer.Canvas.Font.Style:=[fsUnderline];

//根据字体的大小确定每行的高度 这里打印标题
s:='('+self.lMM+')('+trim(self.QryPRn.fieldbyname('nbm').AsString)+')('+self.QryPRn.fieldbyname('gh').AsString+')';
PrintStep:=printer.canvas.TextHeight(s)+Pv_xoffse*6;
//打印的起点位置
x:=PointX*LeftBlank;
y:=PointY*TopBlank;
//以下是打印表格中第一行,
if (QryPrn.Active=true) and (QryPrn.RecordCount>0) then
begin
printer.begin
Doc;
QryPrn.First;
while not QryPrn.Eofdo
begin
//打印DBGrid中的所有列
for i:=0 to Grd.FieldCount-1do
begin
//假如所要打印的列超出了打印范围,则忽略该列
if (x+(Grd.Columns.Items.Width+10)*PointScale)<=(Printer.PageWidth-PointX*RightBlank) then
begin
//画表格线
//每页的第一行打印表头
//Printer.Canvas.Rectangle(x,y+200,x+Grd.Columns.Items.Width*PointScale,y+200+PrintStep);
if y=PointY*TopBlank then
begin
x:=PointX*LeftBlank;
y:=y+PrintStep;
printer.Canvas.Font.Name:='宋体';
printer.canvas.Font.Size:=14;
//Printer.Canvas.TextOut((Printer.PageWidth-printer.Canvas.TextWidth(s)) div 2,y+8,s);
Printer.Canvas.TextOut(x,y,s);

printer.Canvas.Font.Name:='宋体';
printer.canvas.Font.Size:=12;
x:=PointX*LeftBlank;
y:=y+PrintStep;
//Printer.Canvas.TextOut(x+Pv_xoffse,y+8+200,Grd.Columns.Title.Caption);
//Printer.Canvas.TextOut(x+Pv_xoffse*2,y+Pv_yoffse+Pv_xoffse*2,Grd.Columns.Title.Caption);
Printer.Canvas.TextOut(x,y,Grd.Columns.Title.Caption);
end else
begin
fsValue:=Trim(Grd.Fields.asString);
if fsValue='0'
then
fsValue:=''
else
if fsvalue='-1'
then
fsvalue:=''
else
if fsvalue='-3'
then
fsvalue:='';
//Printer.Canvas.TextOut(x+Pv_xoffse,y+200+8,Grd.Fields.asString);
Printer.Canvas.TextOut(x+Pv_xoffse*2,y+Pv_yoffse+Pv_xoffse,fsValue);
end;
end;
//计算下一列的横坐标
x:=x+(Grd.Columns.Items.Width+10)*PointScale;
end;

if not (y=PointY*TopBlank) then
QryPrn.next;
x:=PointX*LeftBlank;
y:=y+PrintStep;
//换页
if (y+PrintStep)>(Printer.PageHeight-PointY*BottomBlank) then
begin
Printer.NewPage;
y:=PointY*TopBlank;
end;

printer.Canvas.MoveTo(x+Pv_xoffse,y+Pv_yoffse);
Printer.Canvas.LineTo(Printer.PageWidth-PointX*RightBlank-Pv_Loffse*2,y+Pv_yoffse);
end;
printer.EndDoc;

end;
end;

结果出来,总是第一行与标题行重叠在一起.为什么??????????????????????????????
 
可能是设置成竖打的原因。
我在打准考证时也遇到。不管怎样设置x,y的大小,打印结果总是排在第一行。
 
帮顶,我也想知道。
我的纵打,所有行均重叠在第一行上。
 
顶部