系统:winxp,D7
打印机:LQ 300在CSDN上找到 zjqyb(风清扬*任它溺水三千,我只取一瓢饮*) 的一段代码
procedure UpdatePrint(Awidth,Aheight:integer);
const    CustomFormName = 'ZJ Defined';  function Win95SetForm(PDevMode: PDeviceMode): Boolean;
  begin
    Printer.PrinterIndex := Printer.PrinterIndex;
    PDevMode.dmFields := PDevMode.dmFields or DM_PAPERSIZE;
    PDevMode.dmPaperSize := 256;
    PDevMode.dmFields := PDevMode.dmFields or DM_PAPERWIDTH;
    PDevMode.dmPaperWidth := AWidth;
    PDevMode.dmFields := PDevMode.dmFields or DM_PAPERLENGTH;
    PDevMode.dmPaperLength := AHeight;
    Printer.PrinterIndex := Printer.PrinterIndex;
    Result := True;
  end;  function WinNTSetForm(PDevMode: PDeviceMode;
    Device: PChar; Port: PChar): Boolean;
  var
    hPrinter: THandle;
    pForm: Pointer;
    cbNeeded: DWORD;
    cReturned: DWORD;
    FormInfo1: TFormInfo1;
  begin
    Result := False;
    if OpenPrinter(Device, hPrinter, nil) then
    begin
      pForm := nil;
      EnumForms(hPrinter, 1, pForm, 0, cbNeeded, cReturned);
      GetMem(pForm, cbNeeded); //取pForm的大小并分配内存
      try
        if EnumForms(hPrinter, 1, pForm, cbNeeded, cbNeeded, cReturned) then
        begin
          if DeleteForm(hPrinter, PChar(CustomFormName)) then
            Dec(cReturned); //删除旧的Form
          with FormInfo1 do
          begin
            Flags := 0;
            pName := PChar(CustomFormName);
            Size.cx := AWidth * 100;
            Size.cy := AHeight * 100;
            with ImageAbleArea do
            begin
              Left := 0;
              Top := 0;
              Right := Size.cx;
              Bottom := Size.cy;
            end;
          end;
          if AddForm(hPrinter, 1, @FormInfo1) then
          begin
            Printer.PrinterIndex := Printer.PrinterIndex;
            PDevMode.dmFields := PDevMode.dmFields or DM_PAPERSIZE;
            PDevMode.dmPaperSize := cReturned + 1;
            Printer.PrinterIndex := Printer.PrinterIndex;
            Result := True;
          end;
        end;
      finally
        FreeMem(pForm);
      end;
    end;
  end;
var
  Device, Driver, Port: array[0..127] of char;
  hDevMode: THandle;
  PDevMode: PDeviceMode;
begin
  Printer.GetPrinter(Device, Driver, Port, hDevMode);
  if hDevMode <> 0 then
  begin
    PDevMode := GlobalLock(hDevMode);
    try
      if (Win32Platform = VER_PLATFORM_WIN32s) or
        (Win32Platform = VER_PLATFORM_WIN32_WINDOWS) then
        Win95SetForm(PDevMode)
      else if Win32Platform = VER_PLATFORM_WIN32_NT then
        WinNTSetForm(PDevMode, Device, Port);
    finally
      GlobalUnlock(hDevMode);
    end;
  end
end;然后这样调用
procedure TForm1.Button1Click(Sender: TObject);
var
  Printer:TPrinter;
begin
  printer:=TPrinter.Create;
  UpdatePrint(1210,960);
  printer.BeginDoc;
  printer.Canvas.TextOut(1,1,'我在做打印测试,谢谢');
  printer.NewPage;
  printer.Canvas.TextOut(1,1,'我在做打印测试,谢谢');
  printer.EndDoc;
end;结果出错了,走纸还是跑了一张A4纸那么长。
是不是我调用错了呢?(我在打印机的服务器属性里有看到加进的纸张 JZ design 12.1cm*9.6cm)

解决方案 »

  1.   

    还有,上面有的代码有点看不明白
    Printer.PrinterIndex := Printer.PrinterIndex;  //这句
    PDevMode.dmFields := PDevMode.dmFields or DM_PAPERSIZE;
    PDevMode.dmPaperSize := cReturned + 1;
    Printer.PrinterIndex := Printer.PrinterIndex;  //还有上面那句,都相同的,作用是什么呢。
      

  2.   

    http://aiirii.mblogger.cn/posts/3412.aspxuses WinSpool, Printers, Windows; function CustomAddForm (const Name:String; const Width, Height:Double; const PrinterName:String):Boolean; 
    var 
      FormInfo1: TFormInfo1; 
      pFormInfo: PFormInfo1; 
      hPrinter : THandle; 
    begin 
      Result := False; 
      if OpenPrinter(PChar(PrinterName),hPrinter,NIL) then 
        begin 
        with FormInfo1 do 
          begin 
          Flags := 0; 
          pName := PAnsiChar(Name); 
          Size.cx := Trunc(Width*1000); 
          Size.cy := Trunc(Height*1000); 
          ImageableArea.Left := 0; 
          ImageableArea.Top := 0; 
          ImageableArea.Bottom := Size.cy; 
          ImageableArea.Right := Size.cx; 
          end; 
        pFormInfo := @FormInfo1; 
        Result := AddForm(hPrinter,1,pFormInfo); 
        ClosePrinter(hPrinter); 
        end; 
    end; 
      

  3.   

    to:aiirii(ari-爱的眼睛) ( ) 是不是调用你这个函数用再用printer.Canvas输出呢?
      

  4.   

    问题找到了!原来这个函数放在另外一个unit里了,对printer对像起不了作用,传一个过就去就OK了