昨日お問い合わせした続きのご質問です。
Windows Vista
Delphi 2007
以上の環境なのですが、
PrintDialogでプリンタを選択した時に
選択した用紙サイズ、印刷枚数、印刷開始ページ、印刷終了ページが
わかるようなプロパティなどはあるのでしょうか。
TPrintDialogのプロパティについてはDocumentExplorer(Delphiヘルプ)から以下をご確認下さい。
ms-help://borland.bds5/delphivclwin32/!!MEMBERTYPE_Properties_Dialogs_TPrintDialog.html
用紙サイズはPrintDialogのプロパティに存在しませんので、
Printers.GetPrinterとDevMode構造体辺りで取得する事になると思います。
DEKOさんご回答ありがとうございます。
DEKOさんがおっしゃるPrinter.GetPrinterとDevMode・・・
どうようにすれば、用紙サイズが取得できるのでしょうか。
手始めにこの辺りを参考にして、
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00614.html
あとは、DevMode構造体でググれば何か掴める。
Nullさんお返事ありがとうございます。
ご教授いただいたことを色々トライしたのですが
思うように、PrintDialogで設定した
印刷枚数、用紙サイズを取得できません。
どうしてなのかな〜
ガオ〜さん
>印刷枚数、用紙サイズを取得できません。
>どうしてなのかな〜
私の場合、PrintDialogは使わなかったので原因はわかりません。
私は、
上記、サンプルプログラムと直接データのやり取りが出来るI/O画面を
作って対応しました。 ↓参照して下さい。(画像のみ)
>http://www.h3.dion.ne.jp/~sakura-t/prn/newpage1.html
直接の解決に成らなくて申し訳ありません。
ガオ〜さん
画像は今週末(2/16)に削除します。
何度も御免なさい。
サンプルプログラムの関連ページにも注意書きがあったと思いますが
パソコンのユーザーアカウントの種類によっては、設定が反映されない
場合もありますのでご注意を。
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);
>思うように、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)
サンプルPGにもう一度目を通して下さい。
もしかして... ↓
nDS := (DevMode^.dmDefaultSource); // 給紙
nPS := (DevMode^.dmPaperSize); // 用紙サイズ
nOR := (DevMode^.dmOrientation); // 用紙方向
変数名は適宜読み替えて。
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;
Mr.XRAYさんお返事ありがとうございます。
ご教授頂いた以下のコーディングそのまま行ったのですが
一回目の指定(枚数を5に指定)でのShowMessageの表示は「1」でした。
2回目以降は指定した枚数が表示されます。
どうして1回目の指定枚数が表示されないのでしょうか。
procedure TForm1.Button1Click(Sender: TObject);
begin
if PrintDialog1.Execute then begin
ShowMessage(IntToStr(PrintDialog1.Copies));
end;
end;
DEKOさんお返事ありがとうございます。
ご教授頂いた以下のコーディングコンパイルした際
「DocumentProperties未定義の識別子」というエラーが
でました。
どうしてでしょうか?
ごめんなさい。なにもわからなくて・・・・・
> 「DocumentProperties未定義の識別子」というエラーが
> でました。
> どうしてでしょうか?
uses
WinSpool
ソース検索とか、Google検索とかしてみた?
WinSpool.pasさんご回答ありがとうございます。
Mr.XRAYさん、先程の1回目の表示が「1」の件ですが
「部単位で印刷」のチェックが付いていると「1」表示になります。
チェックを外すと指定通りの枚数が表示されます。
どうしてなのでしょうか?
VCLソースを読むと解ります(あえて詳細には触れません)が、
「部単位で印刷」はバグ(仕様?)というか...マトモに動作しません。
ちなみに「部単位で印刷」は"Collate"です。
>「部単位で印刷」のチェックが付いていると「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さん,スミマセン,勝手に紹介してしまいました)
>DEKOさんのサイトは,「DEKO Delphi」で検索すればリストのトップに出現します.
DEKOさんのサイトは「アヤシい」そうですので,十分気をつけて下さい(笑).
> DEKOさんのサイトは「アヤシい」そうですので,十分気をつけて下さい(笑).
ひでぇや...ミスター(ToT)
usesにWinSpoolを追加したらコンパイルできました。
しかし、「部単位で印刷」のチェックが付いていると
「1」表示になる件はどうしたらいいかな。
ちなみに、私の環境は
Windows Vista
Delphi 2007 for Win32です。
> しかし、「部単位で印刷」のチェックが付いていると
> 「1」表示になる件はどうしたらいいかな。
...もうレスしねぇ。
ツイート | ![]() |