Delphi Tips 
-----------------------------

キーワード:印刷

>> Index

10/02 DataSet を指定していないときに QuickReport の進捗状況を表示する
06/25 RichEdit を印刷したい
09/09 デフォルトプリンタの設定
02/11 プログラムからプリンタのスプーラ表示を開く
02/11 プリンタのスプールファイルを TMetafile に読みこむ
02/08 TBitmap をきれいに印刷する
02/08 クイックレポート関連記事
02/08 最新版クイックレポート(英語)の日本語化
02/08 QuickReport で Canvas プロパティを使う
02/08 用紙の印刷可能範囲を求める
02/08 フォームの印刷時にComboBoxの内容が印刷されない

最終更新: 6625 日前

0150  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/11 osamu rev 1.2
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 2006/10/02 223 編集
DataSet を指定していないときに QuickReport の進捗状況を表示する

> 今回作ったレポートだと TQuickRep.DataSet:=nil で、 OnNeedDataイベ
> ントですべてのデータを供給しているので、プログレスフォームに進捗
> を表示してくれません。
> 実行時には出力すべきレコード数と現在出力中のレコード番号は分かっ
> ています。こういうときに、うまくプログレスフォームで進捗を表示し
> てあげる方法は用意されていないのでしょうか?

QuickRep.QRPrinter.Progress プロパティに 0..100 の範囲の値を指定すると良さそうです。

procedure QuickRep1.DetailBand1AfterPrint(Sender: TQRCustomBand;
  BandPrinted: Boolean);
begin
  QrPrinter.Progress:=Trunc((100/MaxBandCount)*BandCount);
end;

MaxBandCount: 最大レコード数
BandCount: 現在のレコード
参照: [Delphi-ML:25304]

0336  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 2003/06/25 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 2003/06/25 osamu 編集
RichEdit を印刷したい

Delphi の Demo にサンプルコードが含まれています。Delphi5 であれば、

Program Files\Borland\Delphi5\Demos\Richedit\richedit.dpr

に RichEdit の印刷ルーチンがあります。
参照: [Delphi-ML:54315] <Win95> <コンポーネント >

0242  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/09/09 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/09/09 osamu 編集
デフォルトプリンタの設定

>「通常使うプリンタ」を変更したいのですが、よい方法が見つかりません。

最近 SetPrinter API の使い方を覚えました。これで出来ます(^^

procedure SetDefaultPrinter(Index: Integer);
begin
var Device, Driver, Port: array[0..511] of Char;
    hDevMode: THandle;
    hPrinter: THandle;
    pInfo2: ^TPrinterInfo2;
    Size: DWORD;
begin
  Printer.PrinterIndex := Index;
  // デバイス名を得る
  Printer.GetPrinter(Device, Driver, Port, hDevMode);

  // プリンタハンドルを作る。
  Win32Check(OpenPrinter(Device, hPrinter, Nil));
  try
    // Printer_Info_2 に必要なバッファサイズを取得
    WinSpool.GetPrinter(hPrinter, 2, pInfo2, 0, @size);

    // バッファ確保
    GetMem(pInfo2, size);
    try
      // プリンタ情報を取得
      Win32Check(WinSpool.GetPrinter(hPrinter, 2, pInfo2, Size, @size));

      // デフォルトプリンタにする
      pInfo2.Attributes := pInfo2.Attributes or
                           PRINTER_ATTRIBUTE_DEFAULT;

      // プリンタ情報をプリンタへセットする
      Win32Check(WinSpool.SetPrinter(hPrinter, 2, pInfo2,
                          PRINTER_CONTROL_SET_STATUS));
    finally
      FreeMem(pInfo2);
    end;
  finally
    ClosePrinter(hPrinter);
  end;
end;

Win98 でしか確認していません。あしからず。
参照: [Delphi-ML:33386]

0164  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/11 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/11 osamu 編集
プログラムからプリンタのスプーラ表示を開く

Delphiで『スタート』→『設定』→『プリンタ』にある複数のプリンタの中から,指定された特定の名前のプリンタ(たとえばEPSON LP-8000S)などを開いてスプーラの表示にしたいのですがどうすればいいでしょうか。
参照: [Delphi-ML:31750]

0144  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/11 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/11 osamu 編集
プリンタのスプールファイルを TMetafile に読みこむ

プリンタを一時停止にしておいて印刷すると、windows\temp の下にファイルができますが、それをコピーして拡張子を emf に変えて TImage で覗いたらちゃんと表示されました。
これなら、どんなソフトを使っても印刷さえできれば簡単に emf が作れますね。
参照: [Delphi-ML:14852]

0092  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
TBitmap をきれいに印刷する

TBitmap 印刷用手続きの中村@NECさんバージョンです。
StretchDIBits を使うところがミソだそうです。

procedure StretchDrawBitmap(Canvas: TCanvas;  // 描画先キャンバス
                            r: TRect;         // 描画先の範囲
                            Bitmap: TBitmap   // ビットマップ
                            );
var OldMode:   Integer;     // StretchMode のセーブ
    Info:      PBitmapInfo; // DIB ヘッダ + カラーテーブル
    InfoSize:  Integer;     // DIB ヘッダ + カラーテーブル
    Image:     Pointer;     // DIB のピクセルデータ
    ImageSize: Integer;     // DIB のピクセルデータのサイズ。
begin
  // DIB の「ヘッダ+カラーテーブル」の大きさと ピクセル
  // データの大きさを求める
  GetDIBSizes(Bitmap.Handle, InfoSize, ImageSize);
  Info := Nil;
  Image := Nil;
  try
    // DIB 用のメモリーを確保
    Info := AllocMem(InfoSize);
    Image := Allocmem(ImageSize);

    // DIB を取り出す
    GetDIB(Bitmap.Handle, Bitmap.Palette, Info^, Image^);

    // 描画!!
    OldMode := SetStretchBltMode(Canvas.Handle, COLORONCOLOR);
    StretchDIBits(Canvas.Handle,
                  r.Left, r.Top,
                  r.Right - r.Left, r.Bottom - r.Top,
                  0, 0, Info^.bmiHeader.biWidth,
                  Info^.bmiHeader.biHeight,
                  Image, Info^, DIB_RGB_COLORS, SRCCOPY);
    SetStretchBltMode(Canvas.Handle, OldMode);
  finally
    if Info <> Nil then FreeMem(Info);
    if Image <> Nil then FreeMem(Image);
  end;
end;
参照: [Delphi-ML:20572] <画像>

0094  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
クイックレポート関連記事

まだ未整理ですが、クイックレポート関連の記事をまとめてみました。

[Delphi-ML:8148]
[Delphi-ML:11010]
[Delphi-ML:11263]
[Delphi-ML:11456]
[Delphi-ML:11433]
[Delphi-ML:11648]
[Delphi-ML:11767]
[Delphi-ML:11943]
[Delphi-ML:12824]
[Delphi-ML:14205]
[Delphi-ML:14319]
[Delphi-ML:14484]
[Delphi-ML:14543]
[Delphi-ML:15080]
[Delphi-ML:15901]
[Delphi-ML:16160]
[Delphi-ML:16317]
[Delphi-ML:16364]
[Delphi-ML:16390]
[Delphi-ML:16486]
[Delphi-ML:16664]
[Delphi-ML:16679]
[Delphi-ML:17066]
[Delphi-ML:17256]
[Delphi-ML:17393]
[Delphi-ML:17511]
[Delphi-ML:17503]
[Delphi-ML:17578]
[Delphi-ML:17677]
[Delphi-ML:17942]
[Delphi-ML:18073]
[Delphi-ML:19112]
[Delphi-ML:19316]
[Delphi-ML:19362]
[Delphi-ML:19447]
参照: [Delphi-ML:8148] [Delphi-ML:11010] [Delphi-ML:11263] [Delphi-ML:11456] [Delphi-ML:11433] [Delphi-ML:11648] [Delphi-ML:11767] [Delphi-ML:11943] [Delphi-ML:12824] [Delphi-ML:14205] [Delphi-ML:14319] [Delphi-ML:14484] [Delphi-ML:14543] [Delphi-ML:15080] [Delphi-ML:15901] [Delphi-ML:16160] [Delphi-ML:16317] [Delphi-ML:16364] [Delphi-ML:16390] [Delphi-ML:16486] [Delphi-ML:16664] [Delphi-ML:16679] [Delphi-ML:17066] [Delphi-ML:17256] [Delphi-ML:17393] [Delphi-ML:17511] [Delphi-ML:17503] [Delphi-ML:17578] [Delphi-ML:17677] [Delphi-ML:17942] [Delphi-ML:18073] [Delphi-ML:19112] [Delphi-ML:19316] [Delphi-ML:19362] [Delphi-ML:19447] <データベース>

0100  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
最新版クイックレポート(英語)の日本語化

クイックレポートの最新版を、
    http://www.qusoft.com/scripts/download.dll
から落としてきて、Delphiにインストールすることができます。
但し、プレビューのボタンなどが英語になります。

以前のバージョン(2.0g)のdfmファイルをlibディレクトリにコピーするだけで、実行時パッケージを使用しない場合に限り、実行時に日本語で表示できます。

これを、設計時や実行時パッケージを使ったときにも日本語で表示させる方法が、[Delphi-ML:20984]に紹介されています。
参照: [Delphi-ML:20984] <データベース>

0104  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
QuickReport で Canvas プロパティを使う

QRPrinter.NewPage は、Windows API とか Printer の NewPage とは若干意味合いが異なって、「新しいページの前に」指定する必要があるようです。座標指定は、0.1mm 単位の座標指定を QRPrinter.XPos()、QRPrinter.YPos()でプリンタの物理座標に変換して指定すれば印刷できると思います。

procedure TForm1.Button1Click(Sender: TObject);
begin
  with QuickRep1.QRPrinter do begin
    BeginDoc;
    NewPage;
    Canvas.TextOut(XPos(300), YPos(300), 'test');
    EndDoc;
  end;
end;
参照: [Delphi-ML:21024]

0110  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
用紙の印刷可能範囲を求める

Windows API の GetDeviceCaps 関数を使います。

A--I----------------B
|                   |
J  E-------------F  |
|  |             |  |
|  |             |  |
|  |             |  |
|  |             |  |
|  |             |  |
|  |             |  |
|  G-------------H  |
|                   |
C-------------------D

用紙サイズ ABCD ・印刷可能範囲 EFGH とした場合GetDeviceCaps関数の引数は

    A-B が PHYSICALWIDTH
    A-C が PHYSICALHEIGHT
    E-F が HORZRES
    E-G が VERTRES
    A-I が PHYSICALOFFSETX
    A-J が PHYSICALOFFSETY

となります。
ピクセル単位で値が返されます。
参照: [builder:6063] [builder:6064]

0040  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
フォームの印刷時にComboBoxの内容が印刷されない

Delphi3 になって、フォームの印刷時に TComboBox の内容(テキスト)が印刷表示されなくなりました。
Delphi2 ではちゃんと印刷されます。

kohiroさんが[Delphi-ML:19070]で解法を示してくださっています。
参照: [Delphi-ML:19070] <バグ> <フォーム> <Standard> <コンポーネント >

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords

Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp