unit Unit1;
interface
uses
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;
interface
uses
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.