关于直接打印的问题? 如下程序,为何在实际打印过程中是从纸的中间部分开始打的呀?(而我想要它从左边开始打印呀!)Printer.BeginDoc;printer.Canvas.TextOut(0,100,'abcdef');Printer.EndDoc; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你是不是需要设置一下纸张的大小啊。和开始打印的位置啊。给你段代码你看看有帮助吗?当前打印机的纸张大小:procedure TForm1.Button1Click(Sender: TObject);varDevice: Array[0..(cchDeviceName -1)] of char;Driver: Array[0..(MAX_PATH -1)] of char;Port: Array[0..32] of char;HDMode : THandle;PDMode: PDevMode;beginPrinter.PrinterIndex := Printer.PrinterIndex ;Printer.GetPrinter(Device,Driver,Port,HDMode);if HDMode <> 0 thenbeginPDMode := GlobalLock(HDMode);if PDMode <> nil thenbegincase pDMode.dmPaperSize ofDMPAPER_USER: showmessage('纸张类型:自定义');DMPAPER_A3: showmessage('纸张类型:A3');DMPAPER_A4: showmessage('纸张类型:A4');DMPAPER_A5: showmessage('纸张类型:A5');DMPAPER_B4: showmessage('纸张类型:B4');DMPAPER_B5: showmessage('纸张类型:B5');else showmessage('纸张类型:其它');end;GlobalUnLock(HDMode);Printer.PrinterIndex := Printer.PrinterIndex;end;end;end; 给你点关于打印的资料你看看吧,我今天就放假了,可能没有时间帮你分析了。unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,printers,inifiles, StdCtrls;typeTForm1 = class(Tform) Label1: Tlabel; cbPrinters: TComboBox; procedure FormCreate(Sender: Tobject); procedure cbPrintersChange(Sender: Tobject);end;var Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: Tobject);begin//获取打印机列表并显示当前打印机cbprinters.Items.assign(printer.Printers);cbprinters.Text :=printer.printers[printer.printerindex];label1.caption:=printer.Printers[printer.printerindex];end;procedure TForm1.cbPrintersChange(Sender: Tobject);var Inifile:tinifile; tempStr1,Tempstr2:string; s:array[0..64] of char;beginwith printer do begin//将选中的打印机作为缺省的打印机printerindex:=cbprinters.ItemIndex;tempstr1:=printers[printerindex];//删除不必要的部分system.Delete(tempstr1,pos('on',tempstr1),length(tempstr1));inifile:=tinifile.create('WIN.INI');try tempstr2:=inifile.ReadString('Device',tempstr1,''); //改变缺省打印机的名称 inifile.WriteString('Windows','Device',Tempstr1+','+tempstr2); strcopy(s,'windows'); //向所有的窗体发送消息,说明设置已经发生改变 sendmessage(hwnd_broadcast,wm_settingchange,0,longint(@s));finally inifile.free;end;end;label1.Caption :=printer.printers[printer.printerindex];end;end. 二、获取和设置打印机基本信息 要获取和设置打印机的一些简单信息,可使用打印机的GetPrinter()和SetPrinter()方法。 printer.Getprinter方法的声明格式如下: procedure GetPrinter (Adevice, Adriver, Aport: Pchar; var ADeviceMode: Thandle); 该方法的参数分别表示设备的名称、驱动文件名、端口号和指向打印机的DevMode结构的变量。 Printer.SetPrinter方法的声明格式如下: procedure SetPrinter(Adevice, Adriver, Aport: Pchar; ADeviceMode: Thandle); 该方法的参数同前一方法完全机同,只是两者的功能相反。下面的程序段显示了如何利用这两个方法获取和设置打印机的基本设置。procedure TForm1.Button1Click(Sender: Tobject);var pDevice:pchar; pDriver:pchar; pPort:pchar; hdMode:thandle;beginif printdialog1.Execute then begin getmem(pdevice,cchdevicename); getmem(pdriver,max_path); getmem(pport,max_path); //获取打印机信息,并显示在标签上 printer.GetPrinter(pdevice,pdriver,pport,hdmode); label1.Caption :=pdevice; label2.Caption :=pdriver; label3.Caption :=pport; //将打印内容输出到文件中 printer.SetPrinter(pdevice,pdriver,'FILE:',hdmode); freemem(pdevice,cchdevicename); freemem(pdriver,max_path); freemem(pport,max_path); //开始打印 printer.BeginDoc; printer.Canvas.Textout(100,100,'Delphi Is RAD!'); printer.EndDoc;end; 运行这段代码后,系统会弹出一个对话框,用以选择输出到哪个文件中,文件的扩展名为.prn。 三、控制打印机设置 用Printer.Setprinter方法可以进行打印机的一些基本设置,但要对打印机进行比较深层次的设置,该方法就无能为力了。为在代码中控制打印机设置,需要通过Printer.GetPrinter()方法赤获得打印机的TDeviceMode结构。然后对该结构进行设置。该结构内容较多,其定义格式如下:Tdevicemode = packed recorddmDeviceName: array[0..CCHDEVICENAME - 1] of AnsiChar;dmSpecVersion: Word;dmDriverVersion: Word;dmSize: Word;dmDriverExtra: Word;dmFields: DWORD;dmOrientation: SHORT;dmPaperSize: SHORT;dmPaperLength: SHORT;dmPaperWidth: SHORT;dmScale: SHORT;dmCopies: SHORT;dmDefaultSource: SHORT;dmPrintQuality: SHORT;dmColor: SHORT;dmDuplex: SHORT;dmYResolution: SHORT;dmTTOption: SHORT;dmCollate: SHORT;dmFormName: array[0..CCHFORMNAME - 1] of AnsiChar;dmLogPixels: Word;dmBitsPerPel: DWORD;dmPelsWidth: DWORD;dmPelsHeight: DWORD;dmDisplayFlags: DWORD;dmDisplayFrequency: DWORD;dmICMMethod: DWORD;dmICMIntent: DWORD;dmMediaType: DWORD;dmDitherType: DWORD;dmICCManufacturer: DWORD;dmICCModel: DWORD;dmPanningWidth: DWORD;dmPanningHeight: DWORD;end; 其中各字段的具体意义,在这里不一一列出。获取了该结构变量后,就可以通过对其的操作进行打印机的设置。设置的方法如同下例://设置打印份数With PDMode^ do begin dmFields:=dmfields or dm_copies; dmcopies:=Mycopies;end;//设置打印方向With PDMode^ do begin dmFields:=dmfields or dm_orientation; dmcopies:=dmopient_portrait;end;//设置纸张大小With PDMode^ do begin dmFields:=dmfields or dm_papersize; dmcopies:=dmpaper_letter;end; 四、获取打印机详细信息。 为了获取打印机的详细信息,需要使用API函数DeviceCapabilites()来实现。另外,还有DeviceCapabilitiesA()和DeviceCapabilitiesW()。DeviceCapabilites函数声明格式为:DWORD DeviceCapabilities( LPCTSTR pDevice, LPCTSTR pPort, WORD fwCapability, LPTSTR pOutput, CONST DEVMODE *pDevMode ); 该函数用于获取一个打印机设备驱动程序的性能及兼容性等信息。其中参数pDevice为打印机的名称;pport参数为打印设备的端口;FwCapability指定要查询的内容;Poutput为一个字节数组;PDevMode参数则是一个指向TDeviceMode结构的指针。如果函数执行成功,返回值取决于FwCapability参数的值,否则返回-1。 下面请看一个获取打印机进纸盒名称的完整例子。unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,printers,WinSpool, ComCtrls, StdCtrls;typeTForm1 = class(Tform) ComboBox1: TComboBox; ListView1: TListView; procedure FormCreate(Sender: Tobject); procedure ComboBox1Change(Sender: Tobject);private Device,Driver,Port:array [0..255] of char; AdevMode:thandle; Procedure GetBinNames;end;varForm1: TForm1;implementation{$R *.DFM}type Tbinname=array[0..23] of char; tBinNames=array[0..0] of tbinname;var Rslt:integer;procedure AddListItem(const aCaption,aValue:string;alV:tlistview);//将标题和值加入到Tlistitem中var newitem:tlistitem;beginnewitem:=alv.Items.add;newitem.Caption:=acaption;newitem.SubItems.Add(avalue);end;procedure tform1.GetBinNames;var BinNames:pointer; I:integer;begin{$r-}//首先确定有多少个进纸盒可用rslt:=devicecapabilitiesa(device,port,dc_binnames,nil,nil);if rslt>0 thenbegin //每一个进纸盒名称有24Bytes长,因此分配rslt*24个字节。 getmem(binnames,rslt*24); try if devicecapabilitiesa(device,port,dc_binnames,binnames,nil)=-1 then raise exception.create('DevCap Error'); //将获得的信息加入TlistView中 addlistitem('Bin Names',emptystr,listview1); for I:=0 to rslt -1 do begin addlistitem(format(' Bin Names %d',[I]),strpas(tbinnames(binnames^)[I]),listview1); end; finally freemem(binnames,rslt*24); end;end;{$r+}end;procedure TForm1.FormCreate(Sender: Tobject);begincombobox1.items.assign(printer.printers);combobox1.ItemIndex :=printer.PrinterIndex;combobox1change(nil);end;procedure TForm1.ComboBox1Change(Sender: Tobject);beginscreen.cursor:=crhourglass;try//选择使用的打印机printer.PrinterIndex :=combobox1.ItemIndex;with printer do getprinter(device,driver,port,adevmode); //填充打印机的一般信息 with listview1.items do begin clear; addlistitem('Port',port,listview1); addlistitem('Device',device,listview1); rslt:=devicecapabilitiesa(device,port,dc_driver,nil,nil); addlistitem('Deiver Version',Inttostr(rslt),listview1); end; //获取进纸盒名称,并显示到TlistView中 getbinnames;finally screen.cursor:=crdefault;end;end;end. 有办法提高OleContainer打开文档的速度吗? 在delphi中如何让程序自动重启?? 关于在DBGrideh中设置多行Footer的问题 高人指点,我安装了Delphi7,但是在编译程序的时候出错,请指点! MiS中怎么使子窗体填充整个客户区(不是最大化)? .GDB文件(下載李維的新書)怎樣打開閱讀 关于MDI窗口! 请问如何在Form中加入flash动画? 有关控件和函数(过程)的讨论. >>> 如何实现把一副 .bmp,.jpg格式的图片存入paradox表中??? 有关winexec调用外部文件出错,如何解决? 关于将txt文件读入数据库的问题
给你段代码你看看有帮助吗?
当前打印机的纸张大小:
procedure TForm1.Button1Click(Sender: TObject);varDevice: Array[0..(cchDeviceName -1)] of char;Driver: Array[0..(MAX_PATH -1)] of char;Port: Array[0..32] of char;HDMode : THandle;PDMode: PDevMode;beginPrinter.PrinterIndex := Printer.PrinterIndex ;Printer.GetPrinter(Device,Driver,Port,HDMode);if HDMode <> 0 thenbeginPDMode := GlobalLock(HDMode);if PDMode <> nil thenbegincase pDMode.dmPaperSize ofDMPAPER_USER: showmessage('纸张类型:自定义');DMPAPER_A3: showmessage('纸张类型:A3');DMPAPER_A4: showmessage('纸张类型:A4');DMPAPER_A5: showmessage('纸张类型:A5');DMPAPER_B4: showmessage('纸张类型:B4');DMPAPER_B5: showmessage('纸张类型:B5');else showmessage('纸张类型:其它');end;GlobalUnLock(HDMode);Printer.PrinterIndex := Printer.PrinterIndex;end;end;end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,printers,inifiles,
StdCtrls;type
TForm1 = class(Tform)
Label1: Tlabel;
cbPrinters: TComboBox;
procedure FormCreate(Sender: Tobject);
procedure cbPrintersChange(Sender: Tobject);
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: Tobject);
begin
//获取打印机列表并显示当前打印机
cbprinters.Items.assign(printer.Printers);
cbprinters.Text :=printer.printers[printer.printerindex];
label1.caption:=printer.Printers[printer.printerindex];
end;procedure TForm1.cbPrintersChange(Sender: Tobject);
var
Inifile:tinifile;
tempStr1,Tempstr2:string;
s:array[0..64] of char;
begin
with printer do begin
//将选中的打印机作为缺省的打印机
printerindex:=cbprinters.ItemIndex;
tempstr1:=printers[printerindex];
//删除不必要的部分
system.Delete(tempstr1,pos('on',tempstr1),length(tempstr1));
inifile:=tinifile.create('WIN.INI');
try
tempstr2:=inifile.ReadString('Device',tempstr1,'');
//改变缺省打印机的名称
inifile.WriteString('Windows','Device',Tempstr1+','+tempstr2);
strcopy(s,'windows');
//向所有的窗体发送消息,说明设置已经发生改变
sendmessage(hwnd_broadcast,wm_settingchange,0,longint(@s));
finally
inifile.free;
end;
end;
label1.Caption :=printer.printers[printer.printerindex];
end;end. 二、获取和设置打印机基本信息
要获取和设置打印机的一些简单信息,可使用打印机的GetPrinter()和SetPrinter()方法。
printer.Getprinter方法的声明格式如下:
procedure GetPrinter (Adevice, Adriver, Aport: Pchar; var ADeviceMode: Thandle);
该方法的参数分别表示设备的名称、驱动文件名、端口号和指向打印机的DevMode结构的变量。
Printer.SetPrinter方法的声明格式如下:
procedure SetPrinter(Adevice, Adriver, Aport: Pchar; ADeviceMode: Thandle);
该方法的参数同前一方法完全机同,只是两者的功能相反。下面的程序段显示了如何利用这两个方法获取
和设置打印机的基本设置。
procedure TForm1.Button1Click(Sender: Tobject);
var
pDevice:pchar;
pDriver:pchar;
pPort:pchar;
hdMode:thandle;
begin
if printdialog1.Execute then begin
getmem(pdevice,cchdevicename);
getmem(pdriver,max_path);
getmem(pport,max_path);
//获取打印机信息,并显示在标签上
printer.GetPrinter(pdevice,pdriver,pport,hdmode);
label1.Caption :=pdevice;
label2.Caption :=pdriver;
label3.Caption :=pport;
//将打印内容输出到文件中
printer.SetPrinter(pdevice,pdriver,'FILE:',hdmode);
freemem(pdevice,cchdevicename);
freemem(pdriver,max_path);
freemem(pport,max_path);
//开始打印
printer.BeginDoc;
printer.Canvas.Textout(100,100,'Delphi Is RAD!');
printer.EndDoc;
end;
运行这段代码后,系统会弹出一个对话框,用以选择输出到哪个文件中,文件的扩展名为.prn。
三、控制打印机设置
用Printer.Setprinter方法可以进行打印机的一些基本设置,但要对打印机进行比较深层次的设置,该方
法就无能为力了。为在代码中控制打印机设置,需要通过Printer.GetPrinter()方法赤获得打印机的
TDeviceMode结构。然后对该结构进行设置。该结构内容较多,其定义格式如下:
Tdevicemode = packed record
dmDeviceName: array[0..CCHDEVICENAME - 1] of AnsiChar;
dmSpecVersion: Word;
dmDriverVersion: Word;
dmSize: Word;
dmDriverExtra: Word;
dmFields: DWORD;
dmOrientation: SHORT;
dmPaperSize: SHORT;
dmPaperLength: SHORT;
dmPaperWidth: SHORT;
dmScale: SHORT;
dmCopies: SHORT;
dmDefaultSource: SHORT;
dmPrintQuality: SHORT;
dmColor: SHORT;
dmDuplex: SHORT;
dmYResolution: SHORT;
dmTTOption: SHORT;
dmCollate: SHORT;
dmFormName: array[0..CCHFORMNAME - 1] of AnsiChar;
dmLogPixels: Word;
dmBitsPerPel: DWORD;
dmPelsWidth: DWORD;
dmPelsHeight: DWORD;
dmDisplayFlags: DWORD;
dmDisplayFrequency: DWORD;
dmICMMethod: DWORD;
dmICMIntent: DWORD;
dmMediaType: DWORD;
dmDitherType: DWORD;
dmICCManufacturer: DWORD;
dmICCModel: DWORD;
dmPanningWidth: DWORD;
dmPanningHeight: DWORD;
end;
其中各字段的具体意义,在这里不一一列出。获取了该结构变量后,就可以通过对其的操作进行打印机的
设置。设置的方法如同下例:
//设置打印份数
With PDMode^ do begin
dmFields:=dmfields or dm_copies;
dmcopies:=Mycopies;
end;
//设置打印方向
With PDMode^ do begin
dmFields:=dmfields or dm_orientation;
dmcopies:=dmopient_portrait;
end;
//设置纸张大小
With PDMode^ do begin
dmFields:=dmfields or dm_papersize;
dmcopies:=dmpaper_letter;
end;
四、获取打印机详细信息。
为了获取打印机的详细信息,需要使用API函数DeviceCapabilites()来实现。另外,还有
DeviceCapabilitiesA()和DeviceCapabilitiesW()。DeviceCapabilites函数声明格式为:
DWORD DeviceCapabilities(
LPCTSTR pDevice,
LPCTSTR pPort,
WORD fwCapability,
LPTSTR pOutput,
CONST DEVMODE *pDevMode );
该函数用于获取一个打印机设备驱动程序的性能及兼容性等信息。其中参数pDevice为打印机的名称;
pport参数为打印设备的端口;FwCapability指定要查询的内容;Poutput为一个字节数组;PDevMode参数则是
一个指向TDeviceMode结构的指针。如果函数执行成功,返回值取决于FwCapability参数的值,否则返回-1。
下面请看一个获取打印机进纸盒名称的完整例子。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,printers,WinSpool,
ComCtrls, StdCtrls;type
TForm1 = class(Tform)
ComboBox1: TComboBox;
ListView1: TListView;
procedure FormCreate(Sender: Tobject);
procedure ComboBox1Change(Sender: Tobject);
private
Device,Driver,Port:array [0..255] of char;
AdevMode:thandle;
Procedure GetBinNames;
end;var
Form1: TForm1;implementation{$R *.DFM}
type
Tbinname=array[0..23] of char;
tBinNames=array[0..0] of tbinname;var
Rslt:integer;procedure AddListItem(const aCaption,aValue:string;alV:tlistview);
//将标题和值加入到Tlistitem中
var
newitem:tlistitem;
begin
newitem:=alv.Items.add;
newitem.Caption:=acaption;
newitem.SubItems.Add(avalue);
end;procedure tform1.GetBinNames;
var
BinNames:pointer;
I:integer;
begin
{$r-}
//首先确定有多少个进纸盒可用
rslt:=devicecapabilitiesa(device,port,dc_binnames,nil,nil);
if rslt>0 then
begin
//每一个进纸盒名称有24Bytes长,因此分配rslt*24个字节。
getmem(binnames,rslt*24);
try
if devicecapabilitiesa(device,port,dc_binnames,binnames,nil)=-1 then
raise exception.create('DevCap Error');
//将获得的信息加入TlistView中
addlistitem('Bin Names',emptystr,listview1);
for I:=0 to rslt -1 do
begin
addlistitem(format(' Bin Names %d',[I]),strpas(tbinnames(binnames^)[I]),listview1);
end;
finally
freemem(binnames,rslt*24);
end;
end;
{$r+}
end;
procedure TForm1.FormCreate(Sender: Tobject);
begin
combobox1.items.assign(printer.printers);
combobox1.ItemIndex :=printer.PrinterIndex;
combobox1change(nil);
end;procedure TForm1.ComboBox1Change(Sender: Tobject);
begin
screen.cursor:=crhourglass;
try
//选择使用的打印机
printer.PrinterIndex :=combobox1.ItemIndex;
with printer do
getprinter(device,driver,port,adevmode);
//填充打印机的一般信息
with listview1.items do
begin
clear;
addlistitem('Port',port,listview1);
addlistitem('Device',device,listview1);
rslt:=devicecapabilitiesa(device,port,dc_driver,nil,nil);
addlistitem('Deiver Version',Inttostr(rslt),listview1);
end;
//获取进纸盒名称,并显示到TlistView中
getbinnames;
finally
screen.cursor:=crdefault;
end;
end;end.