喫茶XRAYトップページ

[スレッド全体
]

[9521] プリンタドライバの情報をDEVMODE構造体から取得返信 削除
2016/1/8 (金) 15:38:29 taki
マスター お世話になります。
サンプルプログラム集
「011_プリンタドライバの情報をDEVMODE構造体から取得」での質問です。

やりたい事はPrinterSetupDialogを表示して「用紙サイズ」(種類)を変更したり
「印刷の向き」を変更することで変更された用紙の大きさ(縦・横の長さ)を
得て印刷データの行数を決めたいのです。

dmOrientation,dmPaperSize,dmPaperLength,dmPaperWidthの情報がそれらに
該当するのですが、
サンプルに同梱されている「DEVMODE_Structure.exe」で試したところ

A4縦 → portrait,A4,2970,2100(初期値)
A4横 → landscape,A4,2970,2100
再度 A4横 → landscape,A4,2970,2100
A4縦 → portrait,A4,2970,2100
となります。縦と横の長さが入れ替わるかなと予想したのですが、
そうではないようです。

次に用紙のサイズ(種類)を変更したところ
B5縦 → portrait,B5,2970,2100 (A4用紙の長さが残る?)
再度 B5縦 → portrait,B5,2570,1820 (B5に直った)
となりました。

A4縦 → portrait,A4,2570,1820 (B5用紙の長さが残る?)
再度 A4縦 → portrait,A4,2970,2100 (A4に直った)

どうやらdmPaperLength,dmPaperWidthの情報は直ちには反映されない
ようなのですが、これは仕様?なのでしょうか。
それとも私のPCもしくはプリンタードライバーだけの現象なのでしょうか。

環境 Windows7 Pro,Delphi XE4 Starter,Canon MG5430


[9522] Re:プリンタドライバの情報をDEVMODE構造体から取得返信 削除
2016/1/8 (金) 18:39:42 Mr.XRAY
▼ takiさん,どうもです.

> どうやらdmPaperLength,dmPaperWidthの情報は直ちには反映されない
> ようなのですが、これは仕様?なのでしょうか。
> それとも私のPCもしくはプリンタードライバーだけの現象なのでしょうか。


[01_プリンタドライバの情報を DEVMODE 構造体から取得 ]
http://mrxray.on.coocan.jp/Delphi/plSamples/011_DEVMODE_Structure.htm#01

これですね.ちょっと時間ください.


[9523] Re2:プリンタドライバの情報をDEVMODE構造体から取得返信 削除
2016/1/8 (金) 22:44:35 taki
▼ Mr.XRAYさん
 
> [01_プリンタドライバの情報を DEVMODE 構造体から取得 ]
> http://mrxray.on.coocan.jp/Delphi/plSamples/011_DEVMODE_Structure.htm#01
>
> これですね.ちょっと時間ください.


マスター ご迷惑をおかけしてすみません。<m(__)m>

私のPCの環境のせいではないのですね。

それなら、用紙のサイズ(種類)と向きはリアルタイムに取得できるので、
それらの情報から用紙の縦と横の長さを得ることにします。

つまり、A4なら2970,2100、B5なら2570,1820といった感じで。
その他の用紙は印刷不可ということで回避します。

おさがわせしました。



[9525] Re3:プリンタドライバの情報をDEVMODE構造体から取得返信 削除
2016/1/9 (土) 11:01:34 taki
理由はわかりませんが、PrinterSetupDialogの後にPrintDialogを
呼び出すと用紙の長さが変わります。(正常になります。)

procedure TForm1.Button3Click(Sender: TObject);
var
  ADevice     : array[0..MAX_PATH-1] of Char;
  ADriver     : array[0..MAX_PATH-1] of Char;
  APort       : array[0..MAX_PATH-1] of Char;
  ADeviceMode : THandle;
  ADevMode    : PDeviceMode;

begin
  if PrinterSetupDialog1.Execute then begin
    // 縦の長さを得る
    Printer.GetPrinter(ADevice, ADriver, APort, ADeviceMode);
    ADevMode := GlobalLock(ADeviceMode);
    try
      label1.Caption := inttostr(ADevMode^.dmPaperLength);
    finally
      GlobalUnlock(ADeviceMode);
    end;

    // 必要ないけどPrintDialogを開く
    PrintDialog1.Execute;

    // もう一度縦の長さを得る
    Printer.GetPrinter(ADevice, ADriver, APort, ADeviceMode);
    ADevMode := GlobalLock(ADeviceMode);
    try
      label4.Caption := inttostr(ADevMode^.dmPaperLength);
    finally
      GlobalUnlock(ADeviceMode);
    end;
  end;
end;

まあ、これでもいいかな?


[9526] Re4:プリンタドライバの情報をDEVMODE構造体から取得返信 削除
2016/1/9 (土) 14:50:34 Mr.XRAY
▼ takiさん,どうもです.

> 理由はわかりませんが、PrinterSetupDialogの後にPrintDialogを
> 呼び出すと用紙の長さが変わります。(正常になります。)
>
> まあ、これでもいいかな?


taki さんの書き込みがあったので,今,ちょっと考えています.
[011] のサンプルにはちょっと問題があるんです.
これは,前から分かっていることなんですが,
私は,誤字脱字の名人なので... 慎重にと思っています.


[9532] Re5:プリンタドライバの情報をDEVMODE構造体から取得返信 削除
2016/1/11 (月) 07:31:51 Mr.XRAY
> これは,前から分かっていることなんですが,
> 私は,誤字脱字の名人なので... 慎重にと思っています.


第一段階終了しました.
実際に DEVMODE の値を取得して表示する部分を別ルーチンにしました.
もうちょっとお待ちくださいませ.
taki さん用というわけではなく,利用される方皆さん用ですので (^^;


[9533] Re6:プリンタドライバの情報をDEVMODE構造体から取得返信 削除
2016/1/11 (月) 08:44:48 taki
▼ Mr.XRAYさん
 
> 第一段階終了しました.
> 実際に DEVMODE の値を取得して表示する部分を別ルーチンにしました.
> もうちょっとお待ちくださいませ.
> taki さん用というわけではなく,利用される方皆さん用ですので (^^;


ありがとうございます。(T_T)/


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82