Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2012年08月01日] [更新 各項目を参照] 印刷プレビュー制御コンポーネント
印刷プレビュー制御コンポーネント
ヒント・検討事項・バグ等
動作確認等 -







このページの内容


このページは、主に、コンポーネントを利用された方からの情報等も掲載しています。
掲載記事は順不同です。更新日のもっとも古いのは、このページの作成日となっています。各項目の記事は予告なしに変更、削除する場合があります。




プレビュー画面の操作をキーボードで行う


[掲載 2012年08月01日] [更新 2012年08月01日]

プレビュー画面の操作、表示ページの移動や印刷等を、ボタンクリックだけでなく、キーボードのキーで行う場合の参考コードです。


//=============================================================================
//  Keyによって操作  A 2012/07/31
//=============================================================================
procedure TplPrevForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_F10 then
  begin
    if PrintBtn.Enabled = True then
      PrintBtnClick( Sender );
  end;
  if Key = VK_F9 then
    if CloseBtn.Enabled = True then
      CloseBtnClick( Sender );
  if Key = VK_HOME then
    if FirstPageBtn.Enabled = True then
      FirstPageBtnClick( Sender );
  if Key = VK_END then
    if LastPageBtn.Enabled = True then
      LastPageBtnClick( Sender );
  if Key = VK_PRIOR then
    if PriorPageBtn.Enabled = True then
      PriorPageBtnClick( Sender );
  if Key = VK_NEXT then
    if NextPageBtn.Enabled = True then
      NextPageBtnClick( Sender );
end;




システムにインストールされているプリンタの台数との関係


[掲載 2012年08月02日] [更新 2012年08月16日]

システムにインストールされているプリンタの台数が多いと、印刷プレビューコンポーネントの初期化に失敗する現象とその対応策です。
現在、約 30 近くのプリンタドライバをインストールしていますが、筆者のところでは、この現象は確認できていません。ドライバーだけと、実プリンタの台数との違いがあるのかも知れません。
例えば、以下のようなコードで対処して頂ければ、と思います。


procedure TplSetPrinter.ChangeCurrentPrinter;
begin
  FPrinterNumber := GetPrinterIndexFromString(FPrinterName);
  if (0 <= FPrinterNumber) 
      and (FPrinterNumber < Printer.Printers.Count) then begin
    Printer.PrinterIndex := FPrinterNumber;
  end else begin  
    Printer.PrinterIndex := -1;
  end;




文字列描画時の背景色


[掲載 2012年08月02日] [更新 2012年08月02日]

文字列の描画関係の関数では、背景を透過するようにしています。
これは、文字列を描画する前の背景を有効にするためですが、文字列の実際の描画領域だけの背景を指定したい場合もあるかも知れません。今後のバージョンアップで対応したいと考えています。





TplPrev の Pen ( ペン ) プロパティと Line ( 線 ) プロパティの違い


[掲載 2012年08月02日] [更新 2012年08月02日]

実を言うと、同じです。では何故両方あるのかは、喫茶XRAYの記事へのリンクで確認してください。





バーコードや QR コードの印刷


[掲載 2012年08月04日] [更新 2012年08月04日]

バーコードや QR コードの印刷の参考となる書込みがあります。
その他に、株式会社 テクニカルが提供している バーコードフォントがあります。
これを使用するテストコードが 喫茶XRAY にあります。また、[QR コード表示コンポーネント]の修正版もダウンロード可能です。

有限会社 サイテックが提供している、Barode Label Control というバーコードの ActiveX コントロールは、拙作の TplPrev では描画できません。
この ActiveX コントロールは、インストールした後、[コンポーネントのインポート] [ActiveX コントロールの取り込み]で、登録済みの ActiveX コントロールから、
     [Psytec Barcode Label Control 1.1]
をインストールすると、Delphi で利用可能となります。






バーコード表示コンポーネント TBarImage


[掲載 2016年04月17日] [更新 2016年04月17日]

バーコードの描画に、seizo さんのバーコード表示コンポ TBarImage を使用する例です。
印刷プレビュー制御コンポーネントは、描画の単位が 0.1 mm です。バーコードのナロー幅とワイド幅が描画できることを確認する必要があります。
ナロー幅は最低でも 0.19 mm, ワイド幅はナロー幅の 2.25 ~ 2.5 倍必要です。
この幅は、TBarImage.Scale または T plPrev.StretchDrawMetaFile で調整することができます。
CODE39 では、左右に、ナロースペース (細い空白) の 10 倍以上のスペースが必要です。



//=============================================================================
//  seizoさんのバーコード表示コンポーネント TBarImageを使用する例
//
//  CODE39では左右にナロースペース(細い空白)の10倍以上のスペースが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  BarImage1   : TBarImage;
  LRect       : TRect;
  LTextHeight : Integer;
begin
  plPrev1.BeginDoc;
  BarImage1 := TBarImage.Create(Self);
  try
    BarImage1.BarEnabled    := False;           //表示を一時的に禁止
    BarImage1.BarType       := cbarCODE39;      //CODE39を選択
    BarImage1.Scale         := 3;               //倍率指定
    BarImage1.SymbolDisp    := False;           //シンボル文字列は非表示
    BarImage1.Match         := True;            //バーコードのサイズに合わせて表示
    BarImage1.BarPicture    := picEMF;          //メタファイル(EMF)表示を選択
    BarImage1.BarColor      := clBlack;         //バーコードの色を黒色に指定
    BarImage1.BackColor     := clWhite;         //背景色指定
    BarImage1.BarHeight     := 105;             //高さ指定
    BarImage1.BarLeft       := 0;               //表示位置指定(X座標)
    BarImage1.BarTop        := 0;               //表示位置指定(Y座標)
    BarImage1.BarSpaceUp    := 10;              //上方向の余白のサイズを指定
    BarImage1.BarSpaceDown  := 0;               //下方向の余白のサイズを指定
    BarImage1.BarSpaceLeft  := 10;              //左方向の余白のサイズを指定
    BarImage1.BarSpaceRight := 10;              //右方向の余白のサイズを指定
    BarImage1.Code          := '0123456789ABC'; //Codeプロパティ
    BarImage1.BarEnabled    := True;            //この時点でバーコードが描画される

    LRect.Left   := 100;
    LRect.Top    := 100;
    LRect.Right  := LRect.Left + BarImage1.BarWidth;
    LRect.Bottom := LRect.Top + BarImage1.BarHeight;

    //バーコードを描画
    //plPrev1.Canvas.Draw(LRect.Left, LRect.Top, BarImage1.Picture.Metafile);
    //でも描画可能であるが、StretchDrawMetaFileならサイズ調整が可能なので
    plPrev1.StretchDrawMetaFile(LRect, BarImage1.Picture.Metafile);

    //バーコードにした文字列を描画
    plPrev1.FontSize(10.5);
    plPrev1.FontName('MS Pゴシック');
    LTextHeight  := plPrev1.Canvas.TextHeight(BarImage1.Code);
    plPrev1.TextRectCT(LRect.Left,
                       LRect.Right,
                       LRect.Bottom,
                       LRect.Bottom + LTextHeight,
                       BarImage1.Code);
  finally
    FreeAndNil(BarImage1);
    plPrev1.EndDoc;
  end;
  plPrev1.ShowModal;
end;




複合機での印刷と印刷プレビューの問題


[掲載 2012年12月02日] [更新 2012年12月02日]

この問題は、今回のメールだけでなく、以前から複数の方から指摘されています。また喫茶 XRAY にも書き込みがあります。現在まだ解決に至っていません。ご迷惑をおかけしています。現象は、例えば以下のようなものです。
  • Delphi 2007 でコンパイルした EXE は正常に印刷されるが、Delphi 2009 以降ではエラーが発生する。印刷プレビューはできるが印刷の際にエラーとなる。
  • この現象は、プリンタの用紙設定等が正常に行われていなようである
  • 複合機では、印刷プレビューあるいは、プリンタ設定コンポーネントの用紙設定等が反映されないことがある
プリンタ設定コンポーネントのバグ関係記事も参考にしてください。





メモリリーク ( 逐次表示方式 )


[掲載 2010年03月25日] [更新 2010年03月25日]

メモリリークが発生するバグの報告があります。お手数ですが修正してご利用ください。





印刷後にアプリを終了すると 'ms3XXX.dll で...' のエラー


[掲載 2015年03月17日] [更新 2015年03月17日]

プリンタ HP Officejet H470 で印刷後にアプリを終了すると 'ms3XXX.dll で...' のエラーが発生する報告です。[OK] をクリックすると次々にエラー表示します。
印刷しなければ問題ないそうです。喫茶XRAY で報告がありました。





プリンタが Microsoft PrintTo PDF の時の不具合


[掲載 2023年04月05日] [更新 2023年04月05日]

プリンタが Microsoft PrintTo PDF の時の不具合の報告を頂きました。
印刷プレビューが描画されず、印刷も正常に行われないという内容です。報告をくださった方が対処方法について調べてくださいました。参考にしてください。