如题,谢谢大家。

解决方案 »

  1.   

    如何在程序里控制打印纸张大小(A3,A4)和打印方向?不想打开设置窗口 
    主要解答者: wzrlover 提交人: mrzho 
    感谢: wzrlover 
    审核者: windindance 社区对应贴子: 查看 
         A :  如何在程序里控制打印纸张大小(A3,A4)和打印方向?不想打开设置窗口  
    ---------------------------------------------------------------  
     
    Uses  Printer;  
    .........  
    procedure  TForm1.Button1Click(Sender:  TObject);  
    var  
       ADevice,  ADriver,  APort:  array[0..255]  of  Char;  
       DeviceHandle:  THandle;  
       DevMode:  PDeviceMode;  
    begin  
           //初始化打印机  
           Printer.GetPrinter(ADevice,  ADriver,  APort,  DeviceHandle);  
           if  DeviceHandle  =  0  then  
           begin  
               Printer.PrinterIndex  :=  Printer.PrinterIndex;  
               Printer.GetPrinter(ADevice,  ADriver,  APort,  DeviceHandle);  
           end;  
           if  DeviceHandle  =  0  then  
               Raise  Exception.Create('不能初始化打印机!')  
           else  
               DevMode  :=  GlobalLock(DeviceHandle);  
           if  DeviceHandle  <>  0  then  
           begin  
               with  DevMode^  do  
               begin  
                   dmFields  :=  dmFields  or  DM_ORIENTATION;  
                   //在下面这里设置打印方向  
                   dmOrientation  :=  DMORIENT_LANDSCAPE;  //DMORIENT_PORTRAIT  
                   dmPaperSize  :=  DMPAPER_A3;        
                   Printer.SetPrinter(ADevice,  ADriver,  APort,  DeviceHandle);  
                   GlobalUnLock(DeviceHandle);  
               end;  
           end;  
     
           PrinterSetupDialog1.Execute;  //验证一下设置是否成功了  
    end;  
     *************如何设定打印机的纸张大小? 
    主要解答者: jyh149129 提交人: myboor 
    感谢: h_x_k 
    审核者: lxpbuaa 社区对应贴子: 查看 
         A :  做的套打程序,纸张不标准,想自己设定,不知如何实现  
    printer.pagewidth是只读属性  
    ---------------------------------------------------------------  
     
    参考这个  
     
    var    hDMode:  THandle;  
       PDMode:  PDEVMODE;  
     
       Printer.GetPrinter(Device,  Driver,  Port,  hDMode);  
     
       if  hDMode  <>  0  then  
       begin  
           pDMode  :=  GlobalLock(hDMode);  
           if  pDMode  <>  nil  then  
           begin  
                   pDMode^.dmFields  :=  DM_PAPERSIZE  or  DM_PAPERWIDTH  or  DM_PAPERLENGTH;  
                   pDMode^.dmPaperSize  :=  DMPAPER_USER;  
                   pDMode^.dmPaperWidth  :=  APaperWidth;  
                   pDMode^.dmPaperLength  :=  APaperHeight;  
     
                   pDMode^.dmFields:=pDMode^.dmFields  or  DM_ORIENTATION;  
                   pDMode^.DMORIENTATION:=  Direct;  
           end;  
       end;  
    //打印机设置的纸张大小  
    ---------------------------------------------------------------  
     
    试试这个吧  
    在执行打印前调用以下函数:  
    procedure  SetPaperSize(X,  Y:  Integer);  
    //  单位是0.1mm  
    //  A4时  Printer.Pagewidth:=1440;    A5时  Printer.Pagewidth:=1049;  
    //  B5时  Printer.Pagewidth:=1290;    16K时  Printer.Pagewidth:=1035;  
    //  lq1600宽行打印机这个值宽度最大为42cm左右,  长度大约2m。  
    //改变devicemode结构  
    var  
       Device:  array[0..255]  of  char;  
       Driver:  array[0..255]  of  char;  
       Port:  array[0..255]  of  char;  
       hDMode:  THandle;  
       PDMode:  PDEVMODE;  
    begin  
       Printer.PrinterIndex  :=  Printer.PrinterIndex;  
       Printer.GetPrinter(Device,  Driver,  Port,  hDMode);  
       if  hDMode  <>  0  then  
       begin  
           pDMode  :=  GlobalLock(hDMode);  
           if  pDMode  <>  nil  then  
           begin  
               if  (x  =  0)  or  (y  =  0)  then  
               begin  
                   {Set  to  legal}  
                   pDMode^.dmFields  :=  pDMode^.dmFields  or  dm_PaperSize;  
                   {pDMode^.dmPaperSize  :=  DMPAPER_LEGAL;  changed  by  wulianmin}  
                   pDMode^.dmPaperSize  :=  DMPAPER_FANFOLD_US;  
               end  
               else  
               begin  
                   {Set  to  custom  size}  
                   pDMode^.dmFields  :=  pDMode^.dmFields  or  
                       DM_PAPERSIZE  or  
                       DM_PAPERWIDTH  or  
                       DM_PAPERLENGTH;  
                   pDMode^.dmPaperSize  :=  DMPAPER_USER;  
                   pDMode^.dmPaperWidth  :=  x  {SomeValueInTenthsOfAMillimeter};  
                   pDMode^.dmPaperLength  :=  y  {SomeValueInTenthsOfAMillimeter};  
               end;  
               {设定纸张来源}  
               pDMode^.dmFields  :=  pDMode^.dmFields  or  DMBIN_MANUAL;  
               pDMode^.dmDefaultSource  :=  DMBIN_MANUAL;  
     
               GlobalUnlock(hDMode);  
           end;  
       end;  
       Printer.PrinterIndex  :=  Printer.PrinterIndex;  
       //以下开始打印  
       Printer.BeginDoc;  
       Printer.Canvas.TextOut(100,100,  'Test  1');  
       Printer.EndDoc;  
    end;  
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Device: Array[0..(cchDeviceName -1)] of char;
      Driver: Array[0..(MAX_PATH -1)] of char;
      Port: Array[0..32] of char;
      HDMode : THandle;
      PDMode: PDevMode;
    begin
      Printer.PrinterIndex :=  Printer.PrinterIndex ;  Printer.GetPrinter(Device,Driver,Port,HDMode);  if HDMode <> 0 then
      begin
        PDMode := GlobalLock(HDMode);    if PDMode <> nil then
        begin
          case pDMode.dmPaperSize of
            DMPAPER_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;
      

  3.   

    请问   jinjazz(近身剪(充电中...)) :
    你的这段代码有效,我试过。在此基础上,如何获得当前纸张的名称、长宽、打印方向?