大虾请教,关于指定打印机打印的位置问题(50分)

  • 主题发起人 主题发起人 LJYY20000102
  • 开始时间 开始时间
L

LJYY20000102

Unregistered / Unconfirmed
GUEST, unregistred user!
我在VB下用如下代码可以控制打印机打印数据的位置,大虾请教,不知在DELPHI如下代码该怎样写
Printer.CurrentX = Val(rs_location.Fields!FYEAR_X) + Val(rs_x_y.Fields!fbank_x)
Printer.CurrentY = Val(rs_location.Fields!FYEAR_Y) + Val(rs_x_y.Fields!fbank_y)
Printer.Print Label2.Caption
end;
----------------------------------------------
 
pineter.canvas.textout(x,y,string)
 
大虾,帮忙看看运行以下代码为什么直打印“中国人民解放军第三五四一厂"而不打印"中国防大学'
procedure TForm1.Button2Click(Sender: TObject);
var
bl:string;
b2:string;
begin
if printer.Printers.Count=0 then
begin
Application.MessageBox('未安装打印机或打印机驱动程序丢失,请与系统管理员联系!', '出错', mb_IconError + mb_OK);
Exit;
end;
bl:='中国防大学';
b2:='中国人民解放军第三五四一厂';
printer.BeginDoc;
printer.Canvas.TextOut(10,10,bl);
printer.Canvas.TextOut(20,12,b2);
printer.EndDoc;
end;
 
printer.Canvas.TextOut(x,y,bl);
这里的x和y不是屏幕上的象素,而是打印机的分辨率。
printer.Canvas.TextOut(10,10,bl);
printer.Canvas.TextOut(20,12,b2);
打印机画布的10个象素估计才零点儿几毫米,是第二行的文字把第一行覆盖了,
要想正确对应打印机的象素和屏幕上的象素,必须先取得打印机的分辨率,打印的时候要重新计算坐标位置
 
取打印机和屏幕的比例:
ScaleX:= GetDeviceCaps(Printer.Handle, LOGPIXELSX) / 96;
ScaleY:= GetDeviceCaps(Printer.Handle, LOGPIXELSY) / 96;
打印时:
Form1.Canvas.TextOut(10,10,bl);
Form1.Canvas.TextOut(20,12,b2);
等于
printer.Canvas.TextOut(Round(10 * ScaleX), Round(10 * ScaleY),bl);
printer.Canvas.TextOut(Round(20 * ScaleX), Round(12 * ScaleY),b2);
 
是这样的我遍得是支票打印程序坐标是我用尺量号存于数据库中的打印是直接调用坐标我在VB中调用很好代码如下:
Sub fconn() '支票打印
'connstring = "provider=microsoft.jet.oledb.4.0;data source=" & App.Path & "/jmdata.mdb"
Set conn_location = CreateObject("adodb.connection")
conn_location.Open connstring
Set rs_location = conn_location.Execute("select * from BANKLOCATION ") '支票各项目定位
Set rs_x_y = conn_location.Execute("select * from FBANK_X_Y") '左右边距

Set rs_font_load = conn_location.Execute("select * from fzpfont")

Printer.Orientation = 2 '设置进纸方式
Printer.PaperSize = vbPRPSA4 '设置纸张大小为A4
Printer.ScaleMode = vbCentimeters '以厘米为单位设置打印位置


'设置支票年月日打印字体及打印大小
Printer.Font = rs_font_load.Fields!ffont
Printer.FontSize = rs_font_load.Fields!fzpymdfont
'年
Printer.CurrentX = Val(rs_location.Fields!FYEAR_X) + Val(rs_x_y.Fields!fbank_x)
Printer.CurrentY = Val(rs_location.Fields!FYEAR_Y) + Val(rs_x_y.Fields!fbank_y)
Printer.Print Label2.Caption;

'月
Printer.CurrentX = Val(rs_location.Fields!FMONTH_X) + Val(rs_x_y.Fields!fbank_x)
Printer.CurrentY = Val(rs_location.Fields!FMONTH_Y) + Val(rs_x_y.Fields!fbank_y)
Printer.Print Label3.Caption;

'日
Printer.CurrentX = Val(rs_location.Fields!FDAY_X) + Val(rs_x_y.Fields!fbank_x)
Printer.CurrentY = Val(rs_location.Fields!FDAY_Y) + Val(rs_x_y.Fields!fbank_y)
Printer.Print Label4.Caption;

但在DELPHI中不能直接调用坐标反到要取打印机和屏幕的比例:
 
你要用打印机的Canvas输出的话,只能这样。
 
大虾用printer怎样定义纸张
 
..........................
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部