プリンタの設定(余白)についてご教授ください

解決


  2007-06-27 04:11:56  No: 26832

現在、プリンタのデフォルト設定を変更するプログラムを作成しております。
余白部分の設定方法がおわかりになられる方いらっしゃいますでしょうか。
不要な箇所は記述しておりませんので実際には動きません。

var
  PDevMode    : PDeviceMode;
begin
  Prt := TPrinter.Create;
  Prt.Refresh;
  Prt.GetPrinter(Device, Driver, Port, hDeviceMode);
  Prt.SetPrinter(Device, Driver, Port, 0);
  Prt.GetPrinter(Device, Driver, Port, hDeviceMode);
  PDevMode := GlobalLock(hDeviceMode);
  
  //部数の指定
  PDevMode^.dmCopies := 1;

  //左余白、右余白(mm単位)
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

end;


Mr.XRAY  URL  2007-06-28 07:34:35  No: 26833

プリンタそのものの余白(物理的な印刷のオフセット)はGetDeviceCapsでも取得
できますが設定はできません。
(印刷ではなく、プリンタの設定だからこれでいいのかな?)


  2007-06-28 18:09:27  No: 26834

Mr.XRAY様

貴重なお時間を割いて頂き、回答下さって非常に光栄です。
確かに、GetDeviceCapsで余白そのものは取得可能でした。

D7の「TPageSetupDialog」にて余白を指定できるので、
プリンタのデフォルト設定における余白も設定できるのでは?と思い
調べて3日目に突入しておりました。

小生やりたい事は......

別のアプリケーション
    ↓
Delphiで作成したこのプリンタ設定用のDLLにてプリンタ情報を変更
    ↓
別のアプリケーションにて印刷
    ↓
Delphiで作成したこのプリンタ設定用のDLLにてプリンタ情報を元に戻す

何故別のアプリケーションからDLLをキックするのかというと、
その別のアプリケーションではプリンタ情報を変更する事ができないのです。

しかし、「出来ない」という事がわかった事だけでも、大きな収穫となりました。
本当にありがとうございました。
他の手段を探ってみます。m(_'_)m


  2007-06-28 18:10:09  No: 26835

すみません。解決を付けるのを忘れておりました。


Mr.XRAY  URL  2007-06-29 03:25:57  No: 26836

すでに解決マークが付いているのですが。

>D7の「TPageSetupDialog」にて余白を指定できるので、
>プリンタのデフォルト設定における余白も設定できるのでは?と思い

これは単に値を設定するだけなんです。
この値をどのように使用するかはユーザ(プログラマ)が決めるわけです。
(この余白範囲内に描画コードを書くとか...)

ワードの[ページ設定]の[余白]と同じだと思います。
例えばこの[余白]を越えた範囲にワードの画像、テキストボックスは描画
可能です。

>その別のアプリケーションではプリンタ情報を変更する事ができないのです。

これはかなり難しそうですね。がんばって下さい。
そのアプリの開発者の気持ちも理解できるような気がしますが。


  2007-06-29 21:28:56  No: 26837

Mr.XRAY様
度々ありがとうございます。

ご回答を拝見させて頂いて、ちょっと気にかかる部分がありますので
「解決」チェックをつけてしまいましたが、再度確認させてください。

プリンタのデフォルトの設定でよく余白という所があります。
左:4.1  右:4.1
上:4.1  下:4.1

などの設定部分です。
デフォルトプリンタ設定のこの部分は変更不可なんですよね?

物理的な箇所というか、この部分の単に値を設定したいだけなんですが、
それが出来ないのですよね?(^^;)

用紙の向きや、用紙のサイズ、部数、印刷の品質などは
変更可能だったんです。

度々、質問ばかりで本当にすみません。


Mr.XRAY  URL  2007-06-30 05:13:13  No: 26838

>プリンタのデフォルトの設定でよく余白という所があります。

プリンタドライバが提供している(プリンタのプロパティダイアログで表示される)
ものでしょうか。
とすると、これは、プリンタのDEVMODE構造体の拡張領域のものです。
この領域は、プリンタメーカやプリンタによってメーカが提供している部分ですね。

これらの値を変更するにはそのプリンタのDEVMODE構造体の情報を知る必要があります。
自分で解析するという人柱的なことも可能ですが、そのプリンタだけ、ということに
なるかも知れません(プリンタのシリーズでは統一されているかも?)。
ドライバの開発には必要な情報ですから、メーカに問合わせれば資料が得られるかも
知れません(社外秘というのもあるかも)。

プリンタのドライバは、これらの値に基づいて、印刷データ(つまり画像)の印刷位置
とサイズを決定して印刷していることになります。
したがって、自由に余白や拡大縮小が可能となります。


Mr.XRAY  URL  2007-07-01 00:01:22  No: 26839

>プリンタのDEVMODE構造体の拡張領域のものです。

このプライベート部のデータを表示するプログラム例です。
HDDの中にありましたので...

implementation

uses Printers;

{$R *.dfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
     Memo1.ScrollBars:=ssVertical;
     Memo1.Lines.Clear;
     Memo1.Lines.BeginUpdate;
     GetPrinterExDevmode(Printer.PrinterIndex);
     Memo1.Lines.EndUpdate;
end;
//===========================================================
//  拡張DEVMODE値の取得
//  FDELPHI 11番会議室  高田さんのコード改変
//  ExDevModeのどこに何が定義してあるかはドライバによる
//===========================================================
procedure TForm1.GetPrinterExDevmode(Idx: integer);
type
  {Extra部を含めた拡張TDeviceMode}
  PExDevMode = ^TExDevMode;
  TExDevMode = Packed Record
    dmBasis : TDeviceMode;             //基本
    dmExtra : array [0..1024] of word; //拡張(WORDにした)
  end;
var
  Device, Driver, Port: array[0..79] of Char;
  DeviceMode  : THandle;
  APDev       : PDevMode;
  ExDevMode   : PExDevMode;
  i,cnt       : integer;
begin

  //Index変更後のDEVMODE構造体の再取得
  Printer.PrinterIndex := Idx;
  Printer.GetPrinter(Device, Driver, Port, DeviceMode);
  Printer.SetPrinter(Device, Driver, Port, 0);
  //エラー判定のためのDEVMODE構造体の再取得
  Printer.GetPrinter(Device, Driver, Port, DeviceMode);
  if DeviceMode = 0 then begin
    ShowMessage('Printer.GetPrinter エラー');
    exit;
  end;
  try
    //APDevにロックされたメモリのアドレスを得る
    APDev := GlobalLock(DeviceMode);
    //APDevを拡張TDeviceMode(TExDevMode)にキャスト
    ExDevMode := PExDevMode(APDev);

    //結果の表示
    Memo1.Lines.Add('[プリンタ名]  '+APDev^.dmDeviceName);
    Memo1.Lines.Add('[DEVMODEサイズ]  '+IntToStr(APDev^.dmSize));
    Memo1.Lines.Add('[ExEVMODEサイズ]  '+IntToStr(APDev^.dmDriverExtra));
    Memo1.Lines.Add('[合計サイズ] '+IntToStr(APDev^.dmSize+APDev^.dmDriverExtra));
    Memo1.Lines.Add('');
    Memo1.Lines.Add('★これ以降がExtraData★');

    //dmExtra部の表示
    i:=round(APDev^.dmDriverExtra/2) - 1;//wordは2バイト
    for cnt:=0 to i do begin
      Memo1.Lines.Add(FormatFloat('[000] ',cnt)+ IntToStr(ExDevMode^.dmExtra[cnt]));
    end;
  finally
    GlobalUnLock(DeviceMode);
  end;
end;

がんばって下さい。


  2007-07-02 18:09:20  No: 26840

Mr.XRAY 様

まず、ご返事が遅くなってしまい、申し訳ございませんでした。
度々、貴重なご意見、ありがとうございます。

>プリンタドライバが提供している(プリンタのプロパティダイアログで表示される)
>ものでしょうか。

そうです。おっしゃる通りです。

>とすると、これは、プリンタのDEVMODE構造体の拡張領域のものです。
>この領域は、プリンタメーカやプリンタによってメーカが提供している部分ですね。
>
>これらの値を変更するにはそのプリンタのDEVMODE構造体の情報を知る必要があります。
>自分で解析するという人柱的なことも可能ですが、そのプリンタだけ、ということに
>なるかも知れません(プリンタのシリーズでは統一されているかも?)。
>ドライバの開発には必要な情報ですから、メーカに問合わせれば資料が得られるかも
>知れません(社外秘というのもあるかも)。
>
>プリンタのドライバは、これらの値に基づいて、印刷データ(つまり画像)の印刷位置
>とサイズを決定して印刷していることになります。
>したがって、自由に余白や拡大縮小が可能となります。

何故、余白の設定が「DEVMODE」で出来ないのか、ご指導により、
やっと理解できました。余白部分は、メーカーによって異なる可能性がある箇所だったのですね。
だから、簡単には変更できなかったのですね。

また拡張部分の情報を取得するコードまで載せて頂いて、本当にありがとうございました。

プリンタは複数台、それも、何のプリンターがインストールされているのか、
わからない環境にある為、ご回答内容により、余白の設定を行うのは
不可能に近いと感じています。

ただ、今回スッキリ出来た事が私自身大きな収穫となりました。

長々と本当にありがとうございました。


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

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






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