Последний принтер, использованный при печати с помощью Fast Report (в Delphi) - PullRequest
0 голосов
/ 05 апреля 2009

Как извлечь принтер, выбранный последним пользователем, при печати из окна предварительного просмотра в Fast Report (Basic Edition, версия 4.7.1)?

Я пытался

frxReport.PrintOptions.Printer

в событии OnAfterPrintReport, но возвращает только системный принтер по умолчанию.

После того, как пользователь напечатает отчет, программа напечатает несколько документов Word, и мне нужно знать, какой принтер использовался последним.

Ответы [ 4 ]

2 голосов
/ 07 апреля 2009

После долгих исследований в совершенно другом направлении (перехват 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 на самом деле являются членами класса, но я изменил их, чтобы сделать вещи короткими (э).

2 голосов
/ 08 февраля 2011

Использование 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.
1 голос
/ 21 июня 2013

Глядя на исходный код FastReport для функции TfrxPreviewPages.Print, становится ясно, что обработчик события OnPrintReport вызывается после выбора принтера, но до выполнения задания на печать.

Я поместил следующий код в мой обработчик OnPrintReport:

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

и PrinterName дали тот принтер, который я выбрал в списке принтеров FastReport.

Получив его, вы можете выбрать его позже, выполнив следующее:

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

Я убедился, что все это работает.

0 голосов
/ 06 апреля 2009

Вы можете сохранить принтер по умолчанию для вашего приложения в реестре и получить его до печати. ​​

...