環境 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
なので、キャンセルとして検知できないっぽい。
みなさんの環境では、いかがでしょう?
自己レス
procedure TPrinter.BeginDoc; 内の、StartDoc、StartPage では、
戻り値のチェックをしていませんでした。
いずれも成功すると 0より大きい値が返ってくるらしい。
Printers.pasを、自プロジェクトコピーして、戻り値を確認したところ、
いきなりPDFでは、いずれも -1 になってしまいました。
Primo、瞬簡では、 >0 になっています。
どうやら、このあたりで判断できる可能性がありそうです。
自己レス
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以降なら、大丈夫なのかもしれないが・・・。
解決としますが、他に情報をお持ちの方は、レスください。
ツイート | ![]() |