0

印刷ユニットがあるdllがあります。

私のアプリケーションでは、ドキュメントの印刷だけでなく、印刷プロセスを開始、終了するためのメソッドをエクスポートしました。

dllの呼び出しは次のようになります。

1-> begin printing and print document
2-> print document
3-> end printing.

印刷される各ページ(トレイ、向きなど)の前に設定を変更しています。別の呼び出し(2)を実行し、プリンター設定を変更しようとすると、ステップ1は正常に完了します。メソッド:開発モード構造のResetDcはfalseを返します...

1回の呼び出し後にアプリに戻ったときに、アプリプリンターユニットが何かを変更して、dllでの後続の呼び出しを妨げるという問題はありますか?

問題を回避する方法は?

編集

ページ設定を行う機能はこちらです。(上記のリストから)1回の呼び出しが行われると、ResetDCは正常に実行されますが、次の呼び出しでResetDCはfalseを返します。なぜ ... ?

function PRPageSetup(paperSize: Integer = DMPAPER_A4): Boolean;
var
  pDevice: pChar;
  pDriver: pChar;
  pPort: pChar;
  hDMode: THandle;
  PDMode: PDEVMODE;
  PrnHandle: THandle;

begin
  result := false;
  GetMem(pDevice, cchDeviceName);
  GetMem(pDriver, MAX_PATH);
  GetMem(pPort, MAX_PATH);

  Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);

  if hDMode <> 0 then
  begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then
    begin                 
         pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or DM_ORIENTATION;
         pDMode^.dmPaperSize := paperSize;        

      if Printer.Printing then
        PrnHandle := printer.Canvas.Handle
       else
        PrnHandle := Printer.Handle;

      if ResetDc(PrnHandle, pDMode^) <> 0
        then PRCanReset := true
        else PRCanReset := false;

      Result := true;
      GlobalUnlock(hDMode);
    end;
  end;
  FreeMem(pDevice, cchDeviceName);
  FreeMem(pDriver, MAX_PATH);
  FreeMem(pPort, MAX_PATH);
end;
4

1 に答える 1

0

私はついに問題を解決することができました。

TMetaFileCanvasesがまだメモリ内にある間は、ページを設定できないことを発見しました。最初にそれらを解放してから、ページを再構成する必要がありました。

あなたの努力と時間に感謝します。

于 2012-10-13T19:50:50.297 に答える