请各位大虾伸出援助之手,快来拯救一个八九点钟的太阳吧(关于页边距)(100分)

  • 主题发起人 zwz_good
  • 开始时间
Z

zwz_good

Unregistered / Unconfirmed
GUEST, unregistred user!
最近正在做一个套打程序,由于其中一项在票据的最底部,恰好处于页边距的范围内,
导致无法打印上去,现在不知如何设置页边距为零(是用Tprinter类直接输出到打印机)
我已经折腾了几天了,还是没有头绪。我已经现在茶不思,饭不想了。
请各位大虾伸出援助之手,快来拯救一个八九点钟的太阳吧
 
你可以看一下 TPrinter 的某些属性,应该会有设置边缘的。
 
我能找的都找了,单单没有设置页边距的,愁煞我也。
 
可以在QuickReport页边距、打印机页边距中选择。同时利用ScaleBy属性.
还可以用程序
procedure TForm1.Button1Click(Sender: TObject);
const
LeftBlank=1;
//定义页边距,单位厘米
RightBlank=1;
TopBlank=1;
BottomBlank=1;
var
PointX,PointY:integer;
PointScale,PrintStep:integer;
s: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:=12;
//根据字体的大小确定每行的高度
s:='出货分类统计表';
PrintStep:=printer.canvas.TextHeight(s)+16;
//打印的起点位置
x:=PointX*LeftBlank;
y:=PointY*TopBlank;
//DataSource1是DBGrid1所连接的数据源
if ((DM1.ds2.DataSet).Active=true) and ((DM1.ds2.DataSet).RecordCount>0) then
begin
printer.begin
Doc;
(dm1.ds2.DataSet).First;
while not (dm1.ds2.DataSet).Eofdo
begin
//打印DBGrid中的所有列
for i:=0 to DBGrid1.FieldCount-1do
begin
//假如所要打印的列超出了打印范围,则忽略该列
if (x+DBGrid1.Columns.Items.Width*PointScale)<=(Printer.PageWidth-PointX*RightBlank) then
begin
//画表格线
//每页的第一行打印表头
Printer.Canvas.Rectangle(x,y+200,x+DBGrid1.Columns.Items.Width*PointScale,y+200+PrintStep);
if y=PointY*TopBlank then
begin
printer.Canvas.Font.Name:='黑体';
printer.canvas.Font.Size:=16;
Printer.Canvas.TextOut((Printer.PageWidth-printer.Canvas.TextWidth(s)) div 2,y+8,s);
printer.Canvas.Font.Name:='宋体';
printer.canvas.Font.Size:=12;
Printer.Canvas.TextOut(x+8,y+8+200,DBGrid1.Columns.Title.Caption);
end
else
Printer.Canvas.TextOut(x+8,y+200+8,DBGrid1.Fields.asString);
end;
//计算下一列的横坐标
x:=x+DBGrid1.Columns.Items.Width*PointScale;
end;

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

printer.EndDoc;
(dm1.ds2.DataSet).First;
Application.MessageBox('打印完成','打印',32);
end;
end;

 
to:mlzhou 我现在做的是套打,想将页边距设置为零的,就是说不想要页边距。
我是菜鸟一只,我想问一下关于用QuickRepor设置,来做套打能行吗?
 
**可以在QuickReport页边距、打印机页边距中选择。同时利用ScaleBy属性. **
当然可以在quickreport中作套打,作套打是一件很麻烦的事情。需要尺寸量的特别好,
不然有可能在连续打印几百张之后打印位置就对不上了。
而且跟打印机的类型还有关。
 
to mlzhou: 我先试试,不过真的用Tprinter 就没办法了吗?
 
怎么没人理了吗?难道就只能用QuickRepor吗?
 
[:(!]看来我只能从了QuickRepor,它我还不熟悉,苦海真的无边了.我真的不甘心。。
有谁能用Tprinter类设置页边距呢?
 
难道此问题就这么难?
 
老兄,我找了1个星期了,也是搞不定页边距的问题,更惨的是,我这里接手的程序原来就是用tprinter为底层的类写的,没有办法换成quickreport的
 
取得页边距,打印时x,y分别减去页边距!!然后输出!!
 
看过一个程序,
它是把你要打的页做成了一个TMetafile
就 是一个图,
再去打,
我看控制的不错,
你可以看看,网上有这个控件,叫做PagePrnt
可以参考
 
[:eek:)]
我的一个想法:QuickReport里是可以修改页边距的,而且QuickReport也有原码。这样我
做一个测试的程序,里面有一个QuickReport和一个按钮,然后点击按钮时设置QuickReport
的页边距,再单步进去看QuickReport是怎么实现的,不过我看了一会儿,一点也没看懂
[:I]
 
如何用语句修改QuickReport的边距??
 
俺来射日,做回英雄耍耍先~```
 
[8)]这里有一个弱智的解决方法:自定义纸张。
hehe主要是我刚刚解决了设定纸张的问题。[:D]
你可以调用WinSpool.AddForm来新增一个纸张类型,
而纸张类型的设定
代码:
[blue]
Type FORM_INFO = record
   Flags : integer;
   pName : pointer;
   Size : TSize;
   ImageableArea : TRect;
end;
Type PFormInfo = ^FORM_INFO;
[/blue]
里面可以设定纸张的大小(Size : TSize;)也可以设置打印区域(ImageableArea : TRect;)
 
我也想知,同样的问题现在正难着我
 
多人接受答案了。
 
to mor
能否给我你设置纸张的源码
runsea@hotmail.com
 
顶部