PDF作成で保存キャンセルするとエラー

解決


orz  2007-04-14 00:18:20  No: 25776

環境 WXP SP1 + Delphi5SP1 + QuickReport 2.0

特に、SOURCENEXT いきなり PDF Pro 2 をお持ちの方に質問です。

帳票を印刷するプログラムがあります。
PDF作成に、PrimoPDF、瞬簡PDF、いきなり PDF Pro 2を使ってみました。
Primo、瞬簡では、印刷データ作成後?らいしいタイミングで、保存ファイル名の
入力ダイアログが表示され、いきなりPDFでは、最初に表示されました。

これは、仕様ということで納得したとして、保存ファイル名の入力をキャンセルすると、
いきなりPDFでは、SN_VGDriver2.dll でエラーになってしまいます。
Primo、瞬簡では発生しません。
Acrobat 8 30日体験版でも試してみたところ、タイミング的にはいきなりPDFと同じ、
最初にダイアログが出ますが、エラーなく終了できます。

ちなみに、いきなりPDFは、Ver.1.0.9 の最新にはアップデート済み。

また、キャンセルしても、TPrinter.Printing = True, TPrinter.Aborted = False 
なので、キャンセルとして検知できないっぽい。

みなさんの環境では、いかがでしょう?


orz  2007-04-14 01:00:32  No: 25777

自己レス

procedure TPrinter.BeginDoc; 内の、StartDoc、StartPage では、
戻り値のチェックをしていませんでした。
いずれも成功すると 0より大きい値が返ってくるらしい。

Printers.pasを、自プロジェクトコピーして、戻り値を確認したところ、
いきなりPDFでは、いずれも -1 になってしまいました。
Primo、瞬簡では、 >0 になっています。
どうやら、このあたりで判断できる可能性がありそうです。


orz  2007-04-14 04:56:16  No: 25778

自己レス

StartDoc、StartPage の戻り値が判定できないのが痛すぎる。

プリントジョブがあるか判定する関数を作ってみて、プリンタ名にPDFを含む場合、
チェックするようにしてみたが・・・PDF作成以外に「PDF」を含むプリンタって
世の中にないのだろうか?
なければ、いいのだけど。

function existPrintJob: Boolean;
var
  device, driver, port:array[0..127] of Char;
  deviceMode: THandle;
  hDevice: THandle;
  pPrntrInf2 :PPrinterInfo2;
  cbNeeded: Cardinal;
begin
  deviceMode := 0;
  aPrinter.GetPrinter(@device, @driver, @port, deviceMode);
  if deviceMode = 0 then aPrinter.GetPrinter(@device, @driver, @port, deviceMode);
  OpenPrinter(device, hDevice, nil);
  if (hDevice <> 0) then begin
    GetPrinter(hDevice, 2, nil, 0, @cbNeeded);
    pPrntrInf2 := AllocMem(cbNeeded);
    try
      Win32Check(GetPrinter(hDevice, 2, pPrntrInf2, cbNeeded, @cbNeeded));
      Result := pPrntrInf2^.cJobs > 0;
    finally
      FreeMem(pPrntrInf2);
    end;
    ClosePrinter(hDevice);
  end;
end;

また、うちの場合だけだろうけど、QuickReportの帳票印刷で発生すると
アプリを道連れに死んでしまう。
一個、LightReport使っているっぽいのをダウンロードしてテストしてみたけど、エラーが出た。
普通にのTPrinter を使っていると、Delphi製アプリは、軒並みアウトくさい話だ。

QuickReportがアプリを道連れにする可能性があるので、注意されたし。
QR Ver3.0以降なら、大丈夫なのかもしれないが・・・。

解決としますが、他に情報をお持ちの方は、レスください。


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

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






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