单元名

uses printers;

1、获取控制面板中的打印机列表

Printer.Printers  ;// 返回值类型 TStrings

2、设置打印机的打印属性 打印方向 自定义纸张大小

//参数:lpname  表示指定打印机名字  ''表示非默认打印机
procedure setPrinterInfo(lpname string) ;
var
  ADevice, ADriver, APort: PChar;
  ADeviceMode: THandle ;
  PDMode: PDEVMODE;
  Anew :boolean ;
begin
  GetMem(ADevice,cchDeviceName);
  GetMem(ADriver,MAX_PATH);
  GetMem(APort,MAX_PATH);
  try
      try
          with printer do
          begin
              判定打印机是否切换
              if (lpname <>'') then
              begin 
                  Anew := false;
                  if printerindex <> printer.printers.indexof(lpname ) then
                     Anew := true ;
                  printerindex := printer.printers.indexof(lpname ) ;
              end;
              GetPrinter(ADevice, ADriver, APort,ADeviceMode);
              /**B 针对打印机切换时使用******************************/
              //例如将默认打印机切换到非默认打印机
              //GetNew_DeviceMode 自定义函数,位置UnitPrinterZDY单元中。
              if Anew then
              begin
                ADeviceMode := GetNew_DeviceMode(ADevice) ; 
              end;
              /**E**********************************************/
              if ADeviceMode <>  0 then
              begin
                pDMode  :=  GlobalLock(ADeviceMode);
                if pDMode <>  nil then
                begin
                  pDMode^.dmFields:=pDMode^.dmFields or   DM_ORIENTATION;
                  //设定打印方向横向打印
                  pDMode^.DMORIENTATION:=   DMORIENT_LANDSCAPE ;
                end;
                SetPrinter(ADevice,ADriver,APort, ADeviceMode);
                GlobalUnlock(ADeviceMode);
              end;

              /**开始打印*******/
              BeginDoc ;
              //此处打印内容
              EndDoc ;
              /**结束打印*******/
          end;
      except
      Application.MessageBox('设置失败','提示',MB_OK);
    end;
  finally
    FreeMem(ADevice,cchDeviceName);
    FreeMem(ADriver,MAX_PATH);
    FreeMem(APort,MAX_PATH);
  end;
end ;
unit UnitPrinterZDY;

interface

uses Windows,winspool ;

function GetNew_DeviceMode(ADevice : PChar ) : THandle;

implementation

function GetNew_DeviceMode(ADevice : PChar ) : THandle;
var
  StubDevMode: TDeviceMode;
  FPrinterHandle: THandle;
  DeviceMode: THandle;
  DevMode: PDeviceMode;
begin
  DeviceMode := 0 ;
  if OpenPrinter(ADevice, FPrinterHandle, nil) then
  begin
    DeviceMode := GlobalAlloc(GHND,
      DocumentProperties(0, FPrinterHandle, ADevice, StubDevMode,
      StubDevMode, 0));
    if DeviceMode <> 0 then
    begin
      DevMode := GlobalLock(DeviceMode);
      if DocumentProperties(0, FPrinterHandle, ADevice, DevMode^,
        DevMode^, DM_OUT_BUFFER) < 0 then
      begin
        GlobalUnlock(DeviceMode);
        GlobalFree(DeviceMode);
        DeviceMode := 0;
        DevMode := nil;
      end
    end;
  end;
  result := DeviceMode ;
end ;

end.