现在的位置: 首页 > 综合 > 正文

Delphi 打印实例

2018年02月06日 ⁄ 综合 ⁄ 共 5654字 ⁄ 字号 评论关闭
 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. 

抱歉!评论已关闭.