如何在快速报告(基础版本4.7.1)中从预览窗口打印时检索上次用户选择的打印机?
我试过
frxReport.PrintOptions.Printer
在OnAfterPrintReport事件中,但它只返回系统默认打印机。
用户打印报告后,程序会打印一些Word文档,我需要知道最后使用的是哪台打印机。
答案 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)
您可以在注册表中存储应用程序的默认打印机,并在打印前获取。