如下程序,为何在实际打印过程中是从纸的中间部分开始打的呀?(而我想要它从左边开始打印呀!)
Printer.BeginDoc;
printer.Canvas.TextOut(0,100,'abcdef');
Printer.EndDoc;

解决方案 »

  1.   

    你是不是需要设置一下纸张的大小啊。和开始打印的位置啊。
    给你段代码你看看有帮助吗?
    当前打印机的纸张大小:
    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;
      

  2.   

    给你点关于打印的资料你看看吧,我今天就放假了,可能没有时间帮你分析了。
    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.