![]() |
![]() ![]() ![]() ![]() |
|
Распечатать только выделенный в TRichEdit текстDelphi , ОС и Железо , Принтеры и ПечатьРаспечатать только выделенный в TRichEdit текст
Оформил: DeeCo
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) в принтер. Вот что происходит:
Чтобы только печатать выделенное текстовое содержимое RichEdit-контрола, вы можете модифицировать код следующим образом: В этом модифицированном варианте процедура проверяет, есть ли выбор в RichEdit-контроле перед попыткой его печати. Если нет выбора, код просто выходит без выполнения каких-либо действий. Также можно добавить обработку ошибок и журналирование для обеспечения успешного завершения процесса печати или предоставления meaningful feedback о любых встреченных ошибках при печати. Распечатать только выделенный текст в RichEdit компоненте на принтере с учётом параметров форматирования и отступов. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш :: Главная :: Принтеры и Печать ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||