首页  编辑  

只打印选定的文本

Tags: /超级猛料/VCL/Memo&Edit&Richedit/RichEdit、RxRichEdit/   Date Created:

...print only the selected Text of TRichedit?

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.

}