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

Распечатать только выделенный в TRichEdit текст

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

Распечатать только выделенный в TRichEdit текст

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

uses
   Richedit;

 procedure TForm1.Button1Click(Sender: TObject);
 var
   printarea: TRect;
   richedit_outputarea: TRect;
   printresX, printresY: Integer;
   fmtRange: TFormatRange;
   nextChar: Integer;
   S: string;
 begin
   Printer.BeginDoc;
   try
     with Printer.Canvas do
     begin
       printresX := GetDeviceCaps(Handle, LOGPIXELSX);
       printresY := GetDeviceCaps(Handle, LOGPIXELSY);
       printarea :=
         Rect(printresX,  // 1 inch left margin 
        printresY * 3 div 2,  // 1.5 inch top margin 
        Printer.PageWidth - printresX, // 1 inch right margin 
        Printer.PageHeight - printresY * 3 div 2 // 1.5 inch 
        Bottom Margin);
       // Define a rectangle for the rich edit text. The height is set 
      to the
       // maximum. But we need to convert from device units to twips, 
      // 1 twip = 1/1440 inch or 1/20 point. 
      richedit_outputarea :=
         Rect(printarea.Left * 1440 div printresX,
         printarea.Top * 1440 div printresY,
         printarea.Right * 1440 div printresX,
         printarea.Bottom * 1440 div printresY);

       // Tell rich edit to format its text to the printer. First set 
      // up data record for message: 
      fmtRange.hDC := Handle;            // printer handle 
      fmtRange.hdcTarget := Handle;     // ditto 
      fmtRange.rc := richedit_outputarea;
       fmtRange.rcPage := Rect(0, 0,
         Printer.PageWidth * 1440 div printresX,
         Printer.PageHeight * 1440 div printresY);
       // set range of characters to print to selection 
      fmtRange.chrg.cpMin := richedit1.selstart;
       fmtRange.chrg.cpMax := richedit1.selStart + richedit1.sellength - 1;

       // remove characters that need not be printed from end of 
      selection.
       // failing to do so screws up the repeat loop below. 
      S := Richedit1.SelText;
       while (fmtRange.chrg.cpMax > 0) and
         (S[fmtRange.chrg.cpMax] <= ' ') do Dec(fmtRange.chrg.cpMax);

       repeat
         // Render the text 
        nextChar := richedit1.Perform(EM_FORMATRANGE, 1, Longint(@fmtRange));
         if nextchar < fmtRange.chrg.cpMax then
         begin
           // more text to print 
          printer.newPage;
           fmtRange.chrg.cpMin := nextChar;
         end; { If }
       until nextchar >= fmtRange.chrg.cpMax;

       // Free cached information 
      Richedit1.Perform(EM_FORMATRANGE, 0, 0);
     end;
   finally
     Printer.EndDoc;
   end;
 end;

 { 
  The richedit1.perform( EM_FORMATRANGE call returns the index of the 
  last character that could be fitted into the passed fmtrange.rc, + 1. 
  So if  multiple pages are required one repeats with fmtrange.chrg.cpMin 
  set to this value, until all characters have been printed. 
}

Программный код на Delphi, который печатает выбранное текстовое содержимое RichEdit-контрола (richedit1) в принтер.

Вот что происходит:

  1. Начинается новый документ для печати с помощью Printer.BeginDoc.
  2. Устанавливается прямоугольник печати (printarea) с отступами (левый, верхний, правый, нижний).
  3. Определяется еще один прямоугольник (richedit_outputarea) внутри области печати для представления текста RichEdit-контрола.
  4. Устанавливается форматированный диапазон (fmtRange) для принтера, указывая handle принтера, целевой DC и прямоугольники для области печати и страницы.
  5. Выбирается форматированный диапазон из RichEdit-контрола на основе выбора (индекс начала и длина).
  6. Удаляются любые trailing whitespace символы из выбранного текста, чтобы предотвратить проблемы с повторяющимися циклами позднее.
  7. Метод Perform вызывается рекурсивно до тех пор, пока все символы в выборке не будут напечатаны, корректируя индекс начала (cpMin) соответственно.

Чтобы только печатать выделенное текстовое содержимое RichEdit-контрола, вы можете модифицировать код следующим образом:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if richedit1.SelLength > 0 then // Проверка наличия выбора
    begin
      Printer.BeginDoc;
      try
        with Printer.Canvas do
        begin
          // ... (остальная часть кода остается тем же)
        end;
      finally
        Printer.EndDoc;
      end;
    end;
end;

В этом модифицированном варианте процедура проверяет, есть ли выбор в RichEdit-контроле перед попыткой его печати. Если нет выбора, код просто выходит без выполнения каких-либо действий.

Также можно добавить обработку ошибок и журналирование для обеспечения успешного завершения процесса печати или предоставления meaningful feedback о любых встреченных ошибках при печати.

Распечатать только выделенный текст в RichEdit компоненте на принтере с учётом параметров форматирования и отступов.


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

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




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


:: Главная :: Принтеры и Печать ::


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:09:41/0.0057551860809326/1