使用快速报告打印时使用的最后一台打印机(在Delphi中)

时间:2009-04-05 18:23:54

标签: delphi winapi fastreport

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

我试过

frxReport.PrintOptions.Printer

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

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

4 个答案:

答案 0 :(得分: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实际上是类成员,但我更改了它们以保持简短(呃)。

答案 1 :(得分:2)

使用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.

答案 2 :(得分:1)

查看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;

我已经确认所有这些都有效。

答案 3 :(得分:0)

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