プリンタ設定


ガオー  2008-02-08 23:52:36  No: 29735

昨日お問い合わせした続きのご質問です。
Windows Vista
Delphi 2007
以上の環境なのですが、
PrintDialogでプリンタを選択した時に
選択した用紙サイズ、印刷枚数、印刷開始ページ、印刷終了ページが
わかるようなプロパティなどはあるのでしょうか。


DEKO  2008-02-09 02:33:00  No: 29736

TPrintDialogのプロパティについてはDocumentExplorer(Delphiヘルプ)から以下をご確認下さい。
ms-help://borland.bds5/delphivclwin32/!!MEMBERTYPE_Properties_Dialogs_TPrintDialog.html

用紙サイズはPrintDialogのプロパティに存在しませんので、
Printers.GetPrinterとDevMode構造体辺りで取得する事になると思います。


ガオー  2008-02-09 03:16:35  No: 29737

DEKOさんご回答ありがとうございます。
DEKOさんがおっしゃるPrinter.GetPrinterとDevMode・・・
どうようにすれば、用紙サイズが取得できるのでしょうか。


Null  2008-02-09 03:38:24  No: 29738

手始めにこの辺りを参考にして、
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00614.html

あとは、DevMode構造体でググれば何か掴める。


ガオ〜  2008-02-14 01:27:03  No: 29739

Nullさんお返事ありがとうございます。
ご教授いただいたことを色々トライしたのですが
思うように、PrintDialogで設定した
印刷枚数、用紙サイズを取得できません。
どうしてなのかな〜


Null  2008-02-14 03:35:51  No: 29740

ガオ〜さん

>印刷枚数、用紙サイズを取得できません。
>どうしてなのかな〜

私の場合、PrintDialogは使わなかったので原因はわかりません。

私は、
上記、サンプルプログラムと直接データのやり取りが出来るI/O画面を
作って対応しました。  ↓参照して下さい。(画像のみ)

>http://www.h3.dion.ne.jp/~sakura-t/prn/newpage1.html

直接の解決に成らなくて申し訳ありません。


Null  2008-02-14 03:39:31  No: 29741

ガオ〜さん

画像は今週末(2/16)に削除します。


Null  2008-02-14 04:00:16  No: 29742

何度も御免なさい。

サンプルプログラムの関連ページにも注意書きがあったと思いますが
パソコンのユーザーアカウントの種類によっては、設定が反映されない
場合もありますのでご注意を。


ガオー  2008-02-14 04:16:56  No: 29743

Nullさん、ご面倒おかけして申し訳ありません。
以下のようなコーディングなのですが・・・・
***********************************************
  PrintDialog1.Execute;
  Printer.PrinterIndex := Printer.PrinterIndex;
  Printer.GetPrinter(Device, Driver, Port, DeviceMode);
  Printer.SetPrinter(Device, Driver, Port, 0);
  Printer.GetPrinter(Device, Driver, Port, DeviceMode);
  pDevMode := GlobalLock(DeviceMode);
  kazu := pDevMode.dmCopies;      //選択した印刷枚数が入らない
  yousi := pDevMode.dmPaperSize;  //選択した用紙サイズが入らない
  GlobalUnlock(DeviceMode);


Mr.XRAY  URL  2008-02-14 04:30:35  No: 29744

>思うように、PrintDialogで設定した
>印刷枚数、用紙サイズを取得できません。

どんなふうにやったのかわかりませんが.今やってみました.

procedure TForm1.Button1Click(Sender: TObject);
begin
     if PrintDialog1.Execute then begin
       ShowMessage(IntToStr(PrintDialog1.Copies));
     end;
end;

で印刷部数が取得できましたが...

用紙サイズは以下の関数で取得できる値を参考にして換算して下さい.
ドット(ピクセル)値のままでいいのであれば,インチ当たりのドット(ピクセル)数は必要
ないでしょう(usesにPrintersが必要).
DevMode構造体を使用した取得方法もありますが,
用紙サイズ、印刷枚数、印刷開始ページ、印刷終了ページということなので..

現在のプリンタの
用紙サイズの縦ドット(ピクセル)数
GetDeviceCaps(Printer.Handle,PHYSICALWIDTH)

用紙サイズの横ドット(ピクセル)数
GetDeviceCaps(Printer.Handle,PHYSICALHEIGHT)

横方向解像度(1インチ当たりのドット数)
GetDeviceCaps(Printer.Handle,LOGPIXELSX)

縦方向の解像度(1インチ当たりのドット数)
GetDeviceCaps(Printer.Handle,LOGPIXELSY)


Null  2008-02-14 04:32:21  No: 29745

サンプルPGにもう一度目を通して下さい。

もしかして...  ↓

      nDS   := (DevMode^.dmDefaultSource);     // 給紙
      nPS   := (DevMode^.dmPaperSize);         // 用紙サイズ
      nOR   := (DevMode^.dmOrientation);       // 用紙方向

変数名は適宜読み替えて。


DEKO  2008-02-14 15:17:43  No: 29746

Mr.XRAYさんのおっしゃるように用紙のサイズ(幅/長さ)を取得する事はあっても、
DMPAPER_A4のような定数を取得する場面というのはまずありません。

何故ならDevMode.PaperSizeにDMPAPER_USERが返って来た場合には、
結局、用紙のサイズ(幅/長さ)を取得しなければならなくなるからです。

それでも...と仰るのであれば以下のソースを参考にしてみて下さい。

procedure TForm1.Button1Click(Sender: TObject);
var
  PrinterName, PrinterDriver, PrinterPort: array[0..MAX_PATH] of Char;
  DevMode: PDevMode;
  Dev: TDevMode;
  Hnd: THandle;
  dCopies: Integer;
  dPrintRange: TPrintRange;
  dFromPage, dToPage: Integer;
  dPaperSize, dPaperLength, dPaperWidth, dOrientation: SmallInt;
begin
  // (処理)
  if PrintDialog1.Execute then
    begin
      with PrintDialog1 do
        begin
          dCopies := Copies;         // 印刷枚数
          dPrintRange := PrintRange; // 印刷範囲
          dFromPage := FromPage;     // 開始ページ
          dToPage := ToPage;         // 終了ページ
        end;
      Printer.GetPrinter(PrinterName, PrinterDriver, PrinterPort, Hnd);
      Hnd := GlobalAlloc(GHND, DocumentProperties(0, 0, PrinterName, Dev, Dev, 0));
      if Hnd <> 0 then
        begin
          DevMode := GlobalLock(Hnd);
          try
            DocumentProperties(hInstance, 0, PrinterName, DevMode^, Dev, DM_COPY);
            dPaperSize   := DevMode^.dmPaperSize;   // 用紙のサイズ
            dPaperLength := DevMode^.dmPaperLength; // 用紙の長さ
            dPaperWidth  := DevMode^.dmPaperWidth;  // 用紙の幅
            dOrientation := DevMode^.dmOrientation; // 用紙の向き
          finally
            GlobalUnlock(Hnd);
          end;
          GlobalFree(Hnd);
        end;
      // (処理)
    end;
end;


ガオ〜  2008-02-14 19:02:58  No: 29747

Mr.XRAYさんお返事ありがとうございます。
ご教授頂いた以下のコーディングそのまま行ったのですが
一回目の指定(枚数を5に指定)でのShowMessageの表示は「1」でした。
2回目以降は指定した枚数が表示されます。
どうして1回目の指定枚数が表示されないのでしょうか。
procedure TForm1.Button1Click(Sender: TObject);
begin
     if PrintDialog1.Execute then begin
       ShowMessage(IntToStr(PrintDialog1.Copies));
     end;
end;


ガオ〜  2008-02-14 19:05:53  No: 29748

DEKOさんお返事ありがとうございます。
ご教授頂いた以下のコーディングコンパイルした際
「DocumentProperties未定義の識別子」というエラーが
でました。
どうしてでしょうか?
ごめんなさい。なにもわからなくて・・・・・


WinSpool.pas  2008-02-14 21:05:21  No: 29749

> 「DocumentProperties未定義の識別子」というエラーが
> でました。
> どうしてでしょうか?
uses
  WinSpool

ソース検索とか、Google検索とかしてみた?


ガオ〜  2008-02-14 22:37:27  No: 29750

WinSpool.pasさんご回答ありがとうございます。


ガオ〜  2008-02-14 22:40:27  No: 29751

Mr.XRAYさん、先程の1回目の表示が「1」の件ですが
「部単位で印刷」のチェックが付いていると「1」表示になります。
チェックを外すと指定通りの枚数が表示されます。
どうしてなのでしょうか?


DEKO  2008-02-15 02:18:45  No: 29752

VCLソースを読むと解ります(あえて詳細には触れません)が、
「部単位で印刷」はバグ(仕様?)というか...マトモに動作しません。


DEKO  2008-02-15 02:22:35  No: 29753

ちなみに「部単位で印刷」は"Collate"です。


Mr.XRAY  URL  2008-02-15 03:32:18  No: 29754

>「部単位で印刷」のチェックが付いていると「1」表示になります。
>チェックを外すと指定通りの枚数が表示されます。

う〜ん,わかりません.私のところではそういう現象は発生していません.
私の方がおかしいのかな?
WindowsXP(SP2) + Delph7 Pro

ところで,

> 「DocumentProperties未定義の識別子」というエラーが

の件ですが,エディタは何を使用されていますか?.DEKOさんという方が提供して
いるTEADというエディタを使用すると,この検索機能を利用して,このような
「未定義の識別子」がどのPasで定義されているか,簡単に調べることができます.
しかも,検索した結果のソースもすぐ表示できます.

今,試しにやってみました.私の場合

C:\...Borland\Delphi7\Source\Rtl\Win\WinSpool.pas(1151): function DocumentProperties(hWnd : HWND; ....

とでましたので,WinSpool.pasで定義されていることがわかります.
そこで,usesにWinSpoolを追加すればいいことがわかります.

DEKOさんのサイトは,「DEKO Delphi」で検索すればリストのトップに出現します.
また,私のサイトの「リンク」のぺージにもリストにあります.
(DEKOさん,スミマセン,勝手に紹介してしまいました)


Mr.XRAY  URL  2008-02-15 03:36:09  No: 29755

>DEKOさんのサイトは,「DEKO Delphi」で検索すればリストのトップに出現します.

DEKOさんのサイトは「アヤシい」そうですので,十分気をつけて下さい(笑).


DEKO  2008-02-15 03:50:30  No: 29756

> DEKOさんのサイトは「アヤシい」そうですので,十分気をつけて下さい(笑).
ひでぇや...ミスター(ToT)


ガオ〜  2008-02-15 03:59:12  No: 29757

usesにWinSpoolを追加したらコンパイルできました。
しかし、「部単位で印刷」のチェックが付いていると
「1」表示になる件はどうしたらいいかな。
ちなみに、私の環境は
Windows Vista
Delphi 2007 for Win32です。


DEKO  2008-02-15 05:39:48  No: 29758

> しかし、「部単位で印刷」のチェックが付いていると
> 「1」表示になる件はどうしたらいいかな。
...もうレスしねぇ。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加