Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Richedit


Автор: beginner 5.10.2004, 07:56
Помогите! У меня есть Richedit, в который постоянно добавляются строки текста.
Необходимо разбить на страницы по n-строк и вывести на печать только полные! листы с сохранением аттрибутов текста (подчеркивание и др.).

Автор: Alex 5.10.2004, 20:05
А страницы нужно нумеровать?

Автор: Alex 5.10.2004, 21:53
Лови:
Код
uses
   Printers
 , RichEdit
;

procedure PrintSelTextRichedit(r: TRichEdit);
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 := r.selstart;
     fmtRange.chrg.cpMax := r.selStart + r.sellength - 1;

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

     repeat
        // Render the text
       nextChar := r.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
     r.Perform(EM_FORMATRANGE, 0, 0);
   end;
 finally
   Printer.EndDoc;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 CountPage: Integer;
 k, n: Integer;
begin
 CountPage:= (RichEdit1.Lines.Count-1) div 4;
 k:= 0;

 RichEdit1.SelLength:= 1;
 while CountPage <> 0 do begin
   RichEdit1.SelStart:= RichEdit1.SelLength;
   for n:= k to k + 4 do
     RichEdit1.SelLength:= RichEdit1.SelLength + RichEdit1.Perform(EM_LINELENGTH,n, 0);
   Inc(k, 4);
   //RichEdit1.Perform(EM_SETSEL, RichEdit1.SelStart, RichEdit1.SelLength);
   //RichEdit1.SetFocus;
   PrintSelTextRichedit(RichEdit1);
   dec(CountPage);
 end;
end;

Автор: beginner 6.10.2004, 13:27
Спасибо, буду разбираться...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)