你在每次打印之前,先
printer.PageWidth:=
printer.PageHeight:=
设定之后,才调用实际的打印函数/。

解决方案 »

  1.   

    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;
      

  2.   

    TFormInfo1如何定义?运行到此卡住啦!急盼指点!!尽可能通俗一些,我刚刚入门!
      

  3.   

    zjqyb:太谢谢你啦!你解决了困扰我很久的难题!谢谢!