喫茶XRAYトップページ


[13681] plPrevで例外が・・・返信 削除
2023/11/27 (月) 14:17:18 Syake
ご無沙汰でございます。
当地でもめっきり寒くなりました。
あれほど暑かった夏が・・・。

ところで、印刷プレビューしてMicrosoft Print to PDFを選択後に「OK」
ファイル保存で「キャンセル」で「プリンタは現在印刷を行っておりません」
の例外を速攻で吐くという現象があります。
私の問題は「23/3/22:plPrevで印刷ができなくなる」とは少々異なります。
実際のところ、例外が発生する事は数年前にはわかってはいたのですが
おざなりにしておりました。

procedure TCustomplPrev.Print;
 {---- 略 ------}
  Printer.BeginDoc;//←ここで保存ダイアログが開く
  {保存ダイアログをキャンセル後も以降は継続される}
  FPrinting := True;
  Screen.Cursor := FCursor;
  try
    for i := FromPage to ToPage do
    begin
      ScaleInitialize(Printer.Canvas,False);//例外発生
      {---- 略 ------}
    end;
  finally
    SetMapMode(Printer.Canvas.Handle, MM_TEXT);
    Printer.EndDoc;
    Application.ProcessMessages;
    FPrinting := False;
    Screen.Cursor := SaveCursor;
  end;
 {----- 略 ---------}
end;

で、保存ダイアログをキャンセルするとPrinter.PrintingはFalseの
ままなので、処理が継続されると例外が発生しますので以下の様に
記述を追加してみました。

procedure TCustomplPrev.Print;
 {---- 略 ------}
  Printer.BeginDoc;
  if Printer.Printing then //←条件追加
  begin
    FPrinting := True;
    Screen.Cursor := FCursor;
    try
      for i := FromPage to ToPage do
      begin
        ScaleInitialize(Printer.Canvas,False);//Printerが印刷中でない為ここで例外
        {---- 略 ------}
      end;
    finally
      SetMapMode(Printer.Canvas.Handle, MM_TEXT);
      Printer.EndDoc;
      Application.ProcessMessages;
      FPrinting := False;
      Screen.Cursor := SaveCursor;
    end;
  end;
 {----- 略 ---------}
end;

一応、問題なく働いてくれてますがこんなもので、良いのでしょうか(^-^;


[13682] plPrevで例外が・・・返信 削除
2023/11/27 (月) 14:21:36 Syake
おっと、消し忘れ・・・


procedure TCustomplPrev.Print;
 {---- 略 ------}
  Printer.BeginDoc;
  if Printer.Printing then //←条件追加
  begin
    FPrinting := True;
    Screen.Cursor := FCursor;
    try
      for i := FromPage to ToPage do
      begin
       ScaleInitialize(Printer.Canvas,False);
      {---- 略 ------}
      end;
    finally
      SetMapMode(Printer.Canvas.Handle, MM_TEXT);
      Printer.EndDoc;
      Application.ProcessMessages;
      FPrinting := False;
      Screen.Cursor := SaveCursor;
    end;
  end;
 {----- 略 ---------}
end;

相変わらず、おっちょこちょいで未だに・・・"(-""-)"


[13684] Re:plPrevで例外が・・・返信 削除
2023/11/29 (水) 14:34:07 snail
▼ Syakeさん

plPrevの利用方法は↓に詳しい説明があります。

http://mrxray.on.coocan.jp/Delphi/plPrev/B_UseCont.htm

plPrevを利用したいならPrinterオブジェクトを直接操作してはいけません。
 
>   Printer.BeginDoc;  // ←駄目です。

//---- サンプルを参考にして↓のように利用して下さい。 ----
  plPrev1.BeginDoc;
  try
    plPrev1.Canvas.Font.Height := 180;
    plPrev1.Canvas.TextOut(200, 300, '印刷プレビューの簡単なテスト');
  finally
    plPrev1.EndDoc;
  end;



[13688] Re2:plPrevで例外が・・・返信 削除
2023/12/19 (火) 10:40:33 Syake
▼ snailさん

こんにちは

> ▼ Syakeさん
>
> plPrevの利用方法は↓に詳しい説明があります。
>
> http://mrxray.on.coocan.jp/Delphi/plPrev/B_UseCont.htm
>
> plPrevを利用したいならPrinterオブジェクトを直接操作してはいけません。
>
> >   Printer.BeginDoc;  // ←駄目です。
>
> //---- サンプルを参考にして↓のように利用して下さい。 ----
>   plPrev1.BeginDoc;
>   try
>     plPrev1.Canvas.Font.Height := 180;
>     plPrev1.Canvas.TextOut(200, 300, '印刷プレビューの簡単なテスト');
>   finally
>     plPrev1.EndDoc;
>   end;
>


そういう事では無いのですが・・・。


[13690] Re3:plPrevで例外が・・・返信 削除
2024/1/13 (土) 09:41:39 snail
▼ Syakeさん
> >
> > >   Printer.BeginDoc;  // ←駄目です。

 

Printerオブジェクトを直接操作するソースを載せていたので指摘しただけです。

> そういう事では無いのですが・・・。

間違ったソースを提示して問題だと言われても、、、




[13692] Re4:plPrevで例外が・・・返信 削除
2024/1/17 (水) 18:04:41 Syake
▼ snailさん
> ▼ Syakeさん
> > >
> > > >   Printer.BeginDoc;  // ←駄目です。
>
>
> Printerオブジェクトを直接操作するソースを載せていたので指摘しただけです。
>
> > そういう事では無いのですが・・・。
>
> 間違ったソースを提示して問題だと言われても、、、
>


TCustomplPrev(コンポーネント)内のコード(TCustomplPrev.Prinメソッド)の
改変内容を書いてるだけでplPrevを使用している際のコードを掲示した訳では
ないのですがね。

因みにおしゃってる'Printer.BeginDoc'は上記コンポーネントの
'procedure TCustomplPrev.Print'メソッド内に記述されているコードですよ。
私が記述したコードではありません。



[13693] Re5:plPrevで例外が・・・返信 削除
2024/1/18 (木) 11:42:58 snail
▼ Syakeさん

おっちょこちょいは私の方だったみたいですね。
すいませんでした。

[13694] Re:plPrevで例外が・・・返信 削除
2024/1/30 (火) 16:45:32 おかぽん
こんにちは
(2023年とか見える気がするけど気にしない)

解決案じゃなく、plPrev ですらなく、QuickReport ですが、
PDFの作成キャンセル対策に

1)Printer.Printers[PrinterIndex]に'PDF'の文字があるとき
2)Printer.BeginDoc; 後にプリンタのジョブ数を確認
3)ジョブ数が0だとキャンセル扱いで Printer.EndDoc;

と、させてました。
(ソース有るので改造したやつです。10年以上前に作ったやつでした)

PDFなんて、ローカルのプリンタなので、複数のPDF作成を
同時に行わないであろうという判断でしょうね。

Syakeさんの投稿の通り、Printer.Printing で判断できるなら、
そっちのほうが簡単ですよね。

・・・という、ほぼ独り言です。


INCM/CMT
Cyclamen v3.82