Fast Report (Basic Edition ver. 4.7.1) のプレビュー ウィンドウから印刷するときに、ユーザーが最後に選択したプリンターを取得する方法は?
私は試した
frxReport.PrintOptions.Printer
OnAfterPrintReport イベントでは、システムの既定のプリンターのみが返されます。
ユーザーがレポートを印刷した後、プログラムはいくつかの Word ドキュメントを印刷し、最後に使用されたプリンターを知る必要があります。
Fast Report (Basic Edition ver. 4.7.1) のプレビュー ウィンドウから印刷するときに、ユーザーが最後に選択したプリンターを取得する方法は?
私は試した
frxReport.PrintOptions.Printer
OnAfterPrintReport イベントでは、システムの既定のプリンターのみが返されます。
ユーザーがレポートを印刷した後、プログラムはいくつかの Word ドキュメントを印刷し、最後に使用されたプリンターを知る必要があります。
最後に使用したプリンターを 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.
まったく別の方向 (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 は実際にはクラス メンバーですが、短くするために変更しました。
アプリケーションのデフォルト プリンタをレジストリに保存し、印刷する前に取得できます。