0

私は Delphi XE3 を使用しています。以下は私のサンプル アプリケーションです。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

uses Vcl.Printers;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Printer.Printers[Printer.PrinterIndex]);
end;

end.

窓の下で | 写真 窓の下で コントロール パネル | デバイスとプリンターには、3 つのプリンターがあります。

  1. CutePDF ライター (デフォルトのプリンター)
  2. マイファックス
  3. Microsoft XPS ドキュメント ライター

サンプルアプリケーションを実行して Button1 をクリックすると、デフォルトのプリンターとして「CutePDF Writer」が表示されます。サンプル アプリケーションを閉じずに、Windows | に移動します。コントロール パネル | デバイスとプリンターで「My Fax」をデフォルト プリンターとして設定し、サンプル アプリケーションに戻ってもう一度 Button1 をクリックすると、「CutePDF Writer」がデフォルト プリンターとして表示されます (「My Fax」と表示されるはずです)。ユニット Vcl.Printers でクラス TPrinter を学習した後、次のようにコードを記述できます。

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Printer.Printing then
    Printer.PrinterIndex := -1;
  ShowMessage(Printer.Printers[Printer.PrinterIndex]);
end;

毎回 PrinterIndex を -1 に設定する必要がある場合、これは適切な方法ではありません。私の質問は、デフォルトのプリンターの変更通知があるかどうかをアプリケーションがどのように知るかです。デフォルトのプリンターの変更通知がある場合にのみ、PrinterIndex を -1 に設定するようにします。

4

2 に答える 2

2

WM_SETTINGCHANGE通知メッセージを聞くことができます。MSDN のドキュメントは少しわかりにくいですが、のドキュメントのサンプル コードを見ると、既定のプリンタを変更するすべての当事者がメッセージをブロードキャストする必要があるSetDefaultPrinterことが明確になります。WM_SETTINGCHANGE

残念ながら、WM_SETTINGCHANGE既定のプリンタが変更されたかどうかを判断できる情報は含まれていません。WM_SETTINGCHANGE特定のメッセージがデフォルト プリンタの変更を示しているのか、それとも他の設定の変更を示しているのかを知る方法はありません。

しかし、私はあなたがこのメッセージに応答すべきだというあなたの信念に疑問を投げかけます. 次のシナリオを検討してください。

  • A と B の 2 つのプリンターを備えたマシンがあります。
  • プリンター A がデフォルトのプリンターです。
  • アプリケーションが開始されます。
  • ユーザーは印刷しますが、プリンター B を選択します。
  • ユーザーが再度印刷します。プログラムは、前回はユーザーがプリンター B を望んでいたことを記憶しています。しかし、今回はユーザーがプリンター A を望んでいるので、そのプリンターに変更します。
  • ユーザーは、コントロール パネルでデフォルト プリンタをプリンタ B に変更します。
  • ユーザーは再度印刷に進みます。ユーザーにどのプリンタを提供する必要がありますか?

問題は、アプリケーションに履歴があることです。ユーザーが最後に印刷したとき、プリンター A を明示的に選択しました。既定のプリンターを変更すると、次回は、ユーザーが最後に使用することを選択したプリンターではなく、新しい既定のプリンターをアプリケーションが提供する必要があるのはなぜですか?

于 2013-04-24T09:02:52.800 に答える
-1

追加するだけです:Printer.Refresh;

このような :

procedure TForm1.Button1Click(Sender: TObject); begin Printer.Refresh; ShowMessage(Printer.Printers[Printer.PrinterIndex]); end;

于 2013-11-12T11:50:06.713 に答える