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

Как печатать без TPrinter

Delphi , ОС и Железо , Принтеры и Печать

Как печатать без TPrinter

Автор: Олег Кулабухов

Пример показывает, как использовать PrintDlg() для того, чтобы дать возможность пользователю выбрать принтер, и напечатать две страницы.


uses CommDlg;

{$IFNDEF WIN32}
const
  MAX_PATH = 144;
{$ENDIF}

procedure TForm1.Button1Click(Sender: TObject);
var
  Pd: TPrintDlg;
  DocInfo: TDocInfo;
begin
  FillChar(Pd, sizeof(Pd), #0);
  Pd.lStructSize := sizeof(Pd);
  Pd.hWndOwner := Form1.Handle;
  Pd.Flags := PD_RETURNDC;
  if PrintDlg(pd) then
  begin
    FillChar(DocInfo, sizeof(DocInfo), #0);
    DocInfo.cbSize := SizeOf(DocInfo);
    GetMem(DocInfo.lpszDocName, 32);
    GetMem(DocInfo.lpszOutput, MAX_PATH);
    lStrCpy(DocInfo.lpszDocName, 'My Document');
    {Add this line to print to a file }
    lStrCpy(DocInfo.lpszOutput, 'C:\Download\Test.doc');
    StartDoc(Pd.hDc, DocInfo);
    StartPage(Pd.hDc);
    TextOut(Pd.hDc, 100, 100, 'Page 1', 6);
    EndPage(Pd.hDc);
    StartPage(Pd.hDc);
    TextOut(Pd.hDc, 100, 100, 'Page 2', 6);
    EndPage(Pd.hDc);
    EndDoc(Pd.hDc);
    FreeMem(DocInfo.lpszDocName, 32);
    FreeMem(DocInfo.lpszOutput, MAX_PATH);
  end;
end;

Привет! Вот перевод текста на русский язык:

Код-набор - это пример использования функции PrintDlg в Delphi для печати двух страниц текста без использования компонента TPrinter. Он демонстрирует, как позволить пользователю выбрать принтер и затем напечатать указанный текст.

Вот шаг за шагом, что код делает:

  1. Событийный обработчик Button1Click вызывается при клике кнопки с надписью "Печать" (или ее перевод).
  2. Объект TPrintDlg (Pd) объявляется и инициализируется.
  3. Функция PrintDlg вызывается для отображения диалогового окна печати, позволяющего пользователю выбрать принтер и настроить другие параметры печати. Если пользователь кликнул "ОК", функция возвращает True.
  4. Если пользователь выбрал принтер, код настраивает информацию о документе (DocInfo) следующим шагами:
    • Выделяет память для DocInfo с помощью FillChar.
    • Устанавливает размер DocInfo в размер рекорда TDocInfo.
    • Инициализирует DocInfo.lpszDocName текстом "Мой документ".
    • Инициализирует DocInfo.lpszOutput путем файла "C:\Download\Test.doc". Это будет печатать документ в этом файле вместо отправки его напрямую на принтер.
  5. Код использует следующие функции печати:
    • StartDoc: Начинает новый документ.
    • StartPage: Начинает новую страницу в текущем документе.
    • TextOut: Печатает текст в указанном месте на странице.
    • EndPage: Конец текущей страницы.
    • EndDoc: Конец текущего документа.
  6. Код освобождает память, выделенную для DocInfo.lpszDocName и DocInfo.lpszOutput.

Обратите внимание, что этот код не использует компонент TPrinter, как запрашивал автор оригинального кода. Вместо этого он использует низкоуровневые функции печати (StartDoc, StartPage, TextOut и т.д.) для печати текста.

Если вы хотите достичь аналогичного функциональности с более современным и простым подходом, рассмотрите использование компонента TPrintDialog в Delphi. Он предоставляет более дружественный интерфейс для выбора принтеров и настройки параметров печати. Вы также можете использовать компонент TPrinter для печати документов без необходимости ручного управления процессом печати.

Вот пример, как можно модифицировать код для использования компонента TPrintDialog:

procedure TForm1.Button1Click(Sender: TObject);
var
  PrintDialog: TPrintDialog;
begin
  PrintDialog := TPrintDialog.Create(Self);
  try
    if PrintDialog.Execute then
    begin
      // Получаем DC принтера из диалогового окна печати.
      var PrinterDC := PrintDialog.PrinterDC;

      // Начинаем новый документ.
      StartDoc(PrinterDC, nil);

      // Начинаем новую страницу в текущем документе.
      StartPage(PrinterDC);

      // Печатаем текст в указанном месте на странице.
      TextOut(PrinterDC, 100, 100, 'Страница 1', 6);

      // Конец текущей страницы.
      EndPage(PrinterDC);

      // Начинаем новую страницу в текущем документе.
      StartPage(PrinterDC);

      // Печатаем текст в указанном месте на странице.
      TextOut(PrinterDC, 100, 100, 'Страница 2', 6);

      // Конец текущей страницы.
      EndPage(PrinterDC);

      // Конец текущего документа.
      EndDoc(PrinterDC);
    end;
  finally
    FreeAndNil(PrintDialog);
  end;
end;

В этом примере мы создаем объект TPrintDialog и используем его метод Execute для отображения диалогового окна печати. Если пользователь кликнул "ОК", мы получаем DC принтера из диалогового окна и используем его для начала нового документа, начала новой страницы, печати текста на странице, конца страницы и finally конца документа. Этот код более компактен и легче для чтения, чем оригинальный пример с использованием PrintDlg.

В статье описывается способ печати документа без использования компонента TPrinter, показывая как использовать функцию PrintDlg() для выбора принтера и напечатать две страницы.


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

Получайте свежие новости и обновления по 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 12:41:21/0.005040168762207/1