...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.
}