0

Fast Report (Basic Edition ver. 4.7.1) のプレビュー ウィンドウから印刷するときに、ユーザーが最後に選択したプリンターを取得する方法は?

私は試した

frxReport.PrintOptions.Printer

OnAfterPrintReport イベントでは、システムの既定のプリンターのみが返されます。

ユーザーがレポートを印刷した後、プログラムはいくつかの Word ドキュメントを印刷し、最後に使用されたプリンターを知る必要があります。

4

4 に答える 4

3

最後に使用したプリンターを API フックで保存するのはちょっとやりすぎではありませんか?

FastReport の公式フォーラムで、このより良いアプローチを見つけました。

S:=.../Load From Registry
frxreport1.PrintOptions.Printer:=S;//thats the last selected printer
frxreport1.Print;
S:=frxPrinters.Items[frxPrinters.PrinterIndex].Name;//thats a global var defined in frxPrinter
//Save S to Registry.
于 2011-02-08T11:58:09.427 に答える
2

まったく別の方向 (API フック) で多くの調査を行った後、私はこれを思いつきました。

var
  sLastUsedPrinter: String;

threadvar
  ghHook: Integer;

...

//set frxPrintDialog hook
ghHook := SetWindowsHookEx(WH_CBT, @PrintDialogHookProc, 0, GetCurrentThreadId);
//show prepared report
frxReport.ShowPreparedReport;
//unhook frxPrintDialog hook
UnhookWindowsHookEx(ghHook);

...

function PrintDialogHookProc(uMsg, wParam, lParam: Integer): Integer; stdcall;
var
  //15 chars in 'TfrxPrintDialog' + 1 for string terminator
  sClassName: array [0..15] of Char;
  frxPrintDialog: TForm;
  PrintersCB: TComboBox;
begin
  //when a windows gets activated
  if uMsg = HCBT_ACTIVATE then
  begin
    //get window class name
    GetClassName(wParam, sClassName, 16);
    //window class name is Fast Report's Print Dialog
    if String(sClassName) = 'TfrxPrintDialog' then
    begin
      frxPrintDialog := FindControl(wParam) as TForm;
      PrintersCB := frxPrintDialog.FindComponent('PrintersCB') as TComboBox;
      //remember currently selected printer
      sLastUsedPrinter := PrintersCB.Text;
      //OnChange event handler for the printer selection ComboBox
      PrintersCB.OnChange := PrintersCBChange;
    end;
  end;
  Result := CallNextHookEx(ghHook, uMsg, wParam, lParam);
end;

procedure PrintersCBChange(Sender: TObject);
begin
  //remember last user selected printer
  sLastUsedPrinter := (Sender as TComboBox).Text;
end;

実際のコードでは、sLastUsedPrinter と PrintersCBChange は実際にはクラス メンバーですが、短くするために変更しました。

于 2009-04-07T01:23:50.310 に答える
0

アプリケーションのデフォルト プリンタをレジストリに保存し、印刷する前に取得できます。

于 2009-04-06T18:03:40.023 に答える