0

从快速报告(基础版 4.7.1 版)中的预览窗口打印时如何检索最后用户选择的打印机?

我试过

frxReport.PrintOptions.Printer

在 OnAfterPrintReport 事件中,但它只返回系统默认打印机。

用户打印报告后,程序会打印一些 Word 文档,我需要知道最后使用的是哪台打印机。

4

4 回答 4

3

使用 API Hook 来存储上次使用的打印机有点太多了,不是吗?

我在 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 回答
2

查看该TfrxPreviewPages.Print函数的 FastReport 源代码,很明显,OnPrintReport事件处理程序是在选择打印机之后但在打印作业执行之前调用的。

我将以下代码放入我的OnPrintReport处理程序中:

PrinterName := frxPrinters.Printers[frxPrinters.PrinterIndex];

PrinterName产生了我在 FastReport 打印机选择中选择的任何打印机。

一旦你有了它,你可以稍后通过执行以下操作来选择它:

frxReport.PrepareReport(True);
frxReport.PrintOptions.Printer := PrinterName;
frxReport.PrintOptions.ShowDialog := True;
frxReport.Print;

我已经验证了所有这些都有效。

于 2013-06-21T16:27:13.953 回答
0

您可以将应用程序的默认打印机存储在注册表中,并在打印之前获取它。

于 2009-04-06T18:03:40.023 回答