3

Windows マシンがセットアップしたプリンター ドライバーの設定をキャプチャして、特定のプリンターの丁合いがオンになっているかどうかを判断する必要があります。

DC_COLLATE を渡す DeviceCapabilities 呼び出しを使用してプリンターが丁合できるかどうかを取得する方法は知っていますが、プリンタードライバー丁合するように設定されているかどうかはわかりません。

なんで?

Delphi XE2 で QuickReports の問題を回避しようとしています。Delphi 6 でコンパイルしたときのようにプログラムが動作しなくなりました。Delphi 6 バージョンでは、QuickReport の設定に関係なく、常にプリンタ ドライバの照合設定に従いました。 . Delphi XE2 バージョンではそうではありません。

ユーザーには照合設定を変更するためのセキュリティがなく、システム管理者によって強制的に設定されており、これらのドキュメントは指定されたプリンタで照合して印刷する必要があります。

ドライバーが常に照合するように設定されているかどうかを判断できる場合は、QuickReport で照合設定を強制するだけで、必要なことを実行できるため、上記の質問が表示されます。

いつものように、私はどんなアイデアにも感謝します。

乾杯!

4

1 に答える 1

4

OpenPrinterWindows API 関数とを使用する必要がありますGetPrinter。を呼び出すときGetPrinterに、レコードを渡します。このレコードは、メンバーが;に設定されてPRINTER_INFO_2返されます。そのレコードには、照合が有効かどうかを示すフラグが含まれています (とりわけ)。pDevModeDEVMODEDEVMODE

これは、TeamB の Dr. Peter Below による Borland NG の古い投稿です。プリンター設定を更新して永続的なものにする方法を示していますがOpenPrinter、 、GetPrinterClosePrinter、およびPRINTER_INFO_2の使用とDEVMODE(hDevMode以下のコードで参照); の使用が含まれます。それはあなたを始めるはずです。

Procedure MakePrintersettingsPermanent;
var
  hPrinter: THandle;
  Device : array[0..255] of char;
  Driver : array[0..255] of char;
  Port   : array[0..255] of char;
  hDeviceMode: THandle;
  pDevMode: PDeviceMode;
  bytesNeeded: Cardinal;
  pPI: PPrinterInfo2;
  Defaults: TPrinterDefaults;
  retval: BOOL;
begin
  Assert( Printer.PrinterIndex >= 0 );
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  FillChar( Defaults, Sizeof(Defaults), 0 );
  Defaults.DesiredAccess:= 
    PRINTER_ACCESS_ADMINISTER or PRINTER_ACCESS_USE;
  if not WinSpool.OpenPrinter(@Device, hPrinter, @Defaults ) then
        RaiseLastWin32Error;
  try
    retval := WinSpool.GetPrinter(
      hPrinter,
      2,
      Nil, 0, @bytesNeeded );
    GetMem( pPI, bytesNeeded );
    try
      retval := WinSpool.GetPrinter(
        hPrinter, 2,
        pPI, bytesNeeded, @bytesNeeded );
      If not retval Then 
        RaiseLastWin32Error;

      pDevMode := GlobalLock( hDeviceMode );
      Assert( Assigned( pdevmode ));
      try
        Move( pdevmode^, pPI^.pDevMode^, Sizeof( pdevmode^ ));
      finally
        GlobalUnlock( hDevicemode );
      end;
      If not WinSpool.SetPrinter(
        hPrinter, 2,
        pPI,
        0 )
      Then
        RaiseLastWin32error;
    finally
      FreeMem( pPI );
    end;
  finally
    WinSpool.ClosePrinter( hPrinter );
  end;
end;
于 2013-01-21T22:08:40.723 に答える