プリンターの用紙変更をするには?

解決


くろねこ  2010-03-03 23:19:00  No: 37891

いつも参考にさせていただき有難うございます。
プリンターで2種類のサイズに印刷するのですが、2回目に用紙サイズを設定しようとすると、GlobalLockの戻り値がnilに成ります。
プリンターの終了処理が悪いのですか、教えて下さい。
XP  D4です。

  ADevice, ADriver, APort: array[0..512] of Char;
  ADeviceMode: THandle;
  ADevMode : ^TDevMode;

procedure TForm1.PriBtnClick(Sender: TObject);

    Printer.GetPrinter(ADevice, ADriver, APort, ADeviceMode);
    if ADeviceMode <> 0 then begin
       ADevMode := GlobalLock(ADeviceMode);    //***2回目ここでnilになる
       if (P_No.ItemIndex = 0) then begin // 用紙1           
          ADevMode^.dmPaperLength   := Trunc(Inc_Pix * 4.5);
          ADevMode^.dmPaperWidth    := Inc_Pix *  9;
       end else  begin
          ADevMode^.dmPaperLength   := P_Round(Inc_Pix * 4.0);
          ADevMode^.dmPaperWidth    := P_Round(Inc_Pix *  7.5);
       end;
       GlobalUnLock(ADeviceMode);
       Printer.SetPrinter(ADevice, ADriver, APort, ADeviceMode);


       Printer.BeginDoc;      // 印刷処理開始
       Printer.NewPage;


       Printer.EndDoc; // 終了
       DeleteObject(Printer.Canvas.Font.Handle);
       if ADeviceMode <> 0 then begin
          GlobalUnlock(ADeviceMode);
          GlobalFree(ADeviceMode);
          ADeviceMode := 0;
       end;
       DeleteDC(W_PHand);
    end;
end;


tor  2010-03-04 03:33:35  No: 37892

とりあえず、GlobalUnlockを2回しているのと、
GetPrinterの返したメモリハンドルやらCanvasのフォントやらを
勝手にDelete/Freeしちゃっていいの?というところが気になりますね。


くろねこ  2010-03-04 18:37:55  No: 37893

torさん、ご回答有難うございました。

>  Printer.EndDoc; // 終了
の後の処理を削除したら処理出来るようになりました。  有難うございました。

メモリーの解放等の処理が良くわからないもので、いろんなサンプルから引用しました。印刷が終わったら解放しようと思いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加