Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получение последней использованной принтер в Fast Report из окна предварительного просмотра

Delphi , Базы данных , Отчеты

При работе с Fast Report в Delphi может возникнуть задача получить последнюю использованную принтер после печати отчета из окна предварительного просмотра. В этом материале мы рассмотрим, как это можно сделать.

Описание проблемы

При использовании Fast Report (Basic Edition ver. 4.7.1) для печати отчета из окна предварительного просмотра может возникнуть необходимость получить последнюю использованную принтер. Однако попытка получить принтер с помощью свойства frxReport.PrintOptions.Printer в событии OnAfterPrintReport возвращает только системную принтер по умолчанию, а не ту, которую выбрал пользователь.

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

Альтернативные ответы

Hooking API для получения последней использованной принтер

Один из способов получить последнюю использованную принтер - использовать hooking API. В этом случае можно установить hook на диалог печати Fast Report и отслеживать выбранную пользователем принтер. Вот пример кода, который демонстрирует этот подход:

var
  sLastUsedPrinter: String;
  ghHook: Integer;

...

// Устанавливаем hook на диалог печати Fast Report
ghHook := SetWindowsHookEx(WH_CBT, @PrintDialogHookProc, 0, GetCurrentThreadId);
// Показываем подготовленный отчет
frxReport.ShowPreparedReport;
// Снимаем hook с диалога печати Fast Report
UnhookWindowsHookEx(ghHook);

...

function PrintDialogHookProc(uMsg, wParam, lParam: Integer): Integer; stdcall;
var
  sClassName: array [0..15] of Char;
  frxPrintDialog: TForm;
  PrintersCB: TComboBox;
begin
  // Когда окно активируется
  if uMsg = HCBT_ACTIVATE then
  begin
    // Получаем имя класса окна
    GetClassName(wParam, sClassName, 16);
    // Имя класса окна - диалог печати Fast Report
    if String(sClassName) = 'TfrxPrintDialog' then
    begin
      frxPrintDialog := FindControl(wParam) as TForm;
      PrintersCB := frxPrintDialog.FindComponent('PrintersCB') as TComboBox;
      // Запоминаем выбранную принтер
      sLastUsedPrinter := PrintersCB.Text;
      // Обработчик события изменения выбранной принтер
      PrintersCB.OnChange := PrintersCBChange;
    end;
  end;
  Result := CallNextHookEx(ghHook, uMsg, wParam, lParam);
end;

procedure PrintersCBChange(Sender: TObject);
begin
  // Запоминаем последнюю использованную принтер
  sLastUsedPrinter := (Sender as TComboBox).Text;
end;

В этом примере устанавливается hook на диалог печати Fast Report, и отслеживается выбранная пользователем принтер. При изменении выбранной принтер вызывается обработчик PrintersCBChange, который запоминает последнюю использованную принтер в переменной sLastUsedPrinter.

Использование регистра для хранения последней использованной принтер

Другой подход - использовать регистр для хранения последней использованной принтер. При печати отчета из окна предварительного просмотра можно сохранить выбранную принтер в регистре, а затем получить ее оттуда перед следующей печатью. Вот пример кода, который демонстрирует этот подход:

var
  sPrinterName: String;

...

// Получаем последнюю использованную принтер из регистра
sPrinterName := ... / Load From Registry;
// Устанавливаем выбранную принтер для печати отчета
frxReport.PrintOptions.Printer := sPrinterName;
// Печатаем отчет
frxReport.Print;
// Получаем имя выбранной принтер из списка принтеров Fast Report
sPrinterName := frxPrinters.Items[frxPrinters.PrinterIndex].Name;
// Сохраняем имя выбранной принтер в регистре
... / Save To Registry;

В этом примере перед печатью отчета из окна предварительного просмотра извлекается имя последней использованной принтер из регистра. После печати отчета имя выбранной принтер сохраняется в регистре для дальнейшего использования.

Подтвержденный ответ

После изучения различных подходов к получению последней использованной принтер в Fast Report из окна предварительного просмотра можно сделать вывод, что наиболее простым и надежным способом является использование регистра для хранения последней использованной принтер. Этот подход не требует дополнительных хитростей, таких как hooking API, и гарантирует, что последняя использованная принтер будет доступна для дальнейшей печати.

Вот пример кода, который демонстрирует этот подход:

var
  sPrinterName: String;

...

// Получаем последнюю использованную принтер из регистра
sPrinterName := ... / Load From Registry;
// Устанавливаем выбранную принтер для печати отчета
frxReport.PrintOptions.Printer := sPrinterName;
// Печатаем отчет
frxReport.Print;
// Получаем имя выбранной принтер из списка принтеров Fast Report
sPrinterName := frxPrinters.Items[frxPrinters.PrinterIndex].Name;
// Сохраняем имя выбранной принтер в регистре
... / Save To Registry;

При использовании этого подхода последняя использованная принтер будет автоматически запоминаться и использоваться при следующей печати отчета из окна предварительного просмотра в Fast Report.

Создано по материалам из источника по ссылке.

Материал описывает способы получения последней использованной принтер при работе с Fast Report в Delphi, в частности, после печати отчета из окна предварительного просмотра.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Отчеты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 11:41:49/0.0055379867553711/1