お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"通常使うプリンタに設定する"

この発言に対し以下のコメントが寄せられています
#00791 Kazz さん RE:通常使うプリンタに設定する

◆解説 指定のプリンタを「通常使うプリンタ」に設定します。 また、プリンタドライバに対して、用紙サイズや用紙の向き等の 設定を恒久的に行うことも可能です。 ◆動作確認 Delphi3.1 + Win95a #WinNTでも動作すると思いますが... #もしかしたらセキュリティの関係で動作しない場合があるかも?(^^; ◆実際のコード uses に Printers, WinSpool が必要です。 ----- ここから ----- // //指定のプリンタを「通常使うプリンタ」に設定する // // Entry PrinterName: プリンタ名 // DefautFlag : True [通常使うプリンタ]に設定する // False 〃 設定しない // DevMode : DEVMODE構造体 // プリンタドライバに恒久的に設定される // // [通常使うプリンタ]に設定する処理のみ行う場合には、 // DefautFlag = True, DevMode = nil を指定する // //例1 「通常使うプリンタ」に設定し、DEVMODE構造体も設定する // SetDefaultUsePrinter(PrinterName, True, DevMode); // //例2 「通常使うプリンタ」に設定するのみ // SetDefaultUsePrinter(PrinterName, True, nil); // //例3 DEVMODE構造体を設定し「通常使うプリンタ」は変更しない // SetDefaultUsePrinter(PrinterName, False, DevMode); // //※WinAPIコールに失敗した場合には、例外が発生する点に注意 // procedure SetDefaultUsePrinter(PrinterName: String; DefaultFlag: Boolean; DevMode: PDeviceMode); var hPrinter: THandle; PDefaults: TPrinterDefaults; Needed: DWORD; pInfo: PPrinterInfo2; procedure SetDefaultUsePrinterNT; var pDrvInfo: PDriverInfo2; DefaultPrinter,Driver: String; begin GetPrinterDriver(hPrinter, nil, 2, nil, 0, Needed); pDrvInfo := PDriverInfo2(AllocMem(Needed)); try //for FreeMem Win32Check(GetPrinterDriver(hPrinter, nil, 2, pDrvInfo, Needed, Needed)); Driver := ExtractFileName(String(pDrvInfo^.pDriverPath)); Driver := ChangeFileExt(Driver, ''); DefaultPrinter := String(pInfo^.pPrinterName) + ',' + Driver + ',' + String(pInfo^.pPortName); Win32Check(WriteProfileString('windows', 'device', PChar(DefaultPrinter))); finally FreeMem(pDrvInfo); end; end; begin UniqueString(PrinterName); //不要かも? FillChar(PDefaults, SizeOf(PDefaults), 0); PDefaults.DesiredAccess := PRINTER_ALL_ACCESS; Win32Check(OpenPrinter(PChar(PrinterName), hPrinter, @PDefaults)); try //for ClosePrinter WinSpool.GetPrinter(hPrinter, 2, nil, 0, @Needed); pInfo := PPrinterInfo2(AllocMem(Needed)); try //for FreeMem Win32Check(WinSpool.GetPrinter(hPrinter, 2, pInfo, Needed, @Needed)); with pInfo^ do begin //pSecurityDescriptor := nil; if DefaultFlag then Attributes := Attributes or PRINTER_ATTRIBUTE_DEFAULT; if DevMode <> nil then pDevMode := DevMode; end; Win32Check(WinSpool.SetPrinter(hPrinter, 2, pInfo, 0)); if DefaultFlag then begin if Win32Platform = VER_PLATFORM_WIN32_NT then begin //WinNTの場合、WIN.INIの変更で行う SetDefaultUsePrinterNT; end; //「通常使うプリンタ」が変更されたことを通知する PostMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0); end; finally FreeMem(pInfo); end; finally ClosePrinter(hPrinter); end; end; ----- ここまで ----- ◆使用例 ----- ここから ----- procedure TForm1.Button1Click(Sender: TObject); var Device, Driver, Port: array[0..79] of char; DeviceMode: THandle; DevMode: PDeviceMode; begin //プリンタ名、DEVMODE構造体を取得 Printer.PrinterIndex := 【ここで目的のプリンタを指定する】; Printer.GetPrinter(Device, Driver, Port, DeviceMode); Printer.SetPrinter(Device, Driver, Port, 0); Printer.GetPrinter(Device, Driver, Port, DeviceMode); if DeviceMode = 0 then begin ShowMessage('Printer.GetPrinter エラー'); Exit; end; DevMode := GlobalLock(DeviceMode); try //必要なら、ここで DevModeを修正する //↓ B5横 に設定する例 with DevMode^ do begin dmPaperSize := DMPAPER_B5; //B5 dmOrientation := DMORIENT_LANDSCAPE; //横 end; SetDefaultUsePrinter(Device {←これが「プリンタ名」です} ,True {「通常使うプリンタ」に設定する} ,DevMode {DEVMODE構造体を設定する} ); finally GlobalUnlock(DeviceMode); end; //ここで //PrinterSetupDialog1.Execute; //すれば、設定変更されていることが確認できると思います。 end; ----- ここまで ----- DEVMODE構造体の内容については、Win32APIヘルプを参照して下さい。 「通常使うプリンタ」の設定や、PRINTER_INFO_2構造体を使った 用紙サイズ等の設定変更については、過去ログでも何度か話題に なっていたと思いますが、とりあえず私が使っているルーチンを アップしてみました。(^_^; Original document by Satobe 氏 ID:(JCG00336)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum