Maks150988
![](http://forum.ru-board.com/board/avatars/russia.gif)
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Немного поизменял код. Получилось так: Код: procedure PrintDocument(Printer, Text : String); const BORDERLEFT = 20; BORDERRIGHT = 20; BORDERTOP = 20; BORDERBOTTOM = 20; var TextDC : HDC; DocInfo : TDocInfo; PageW, PageH, NewFont, OldFont, Paragraphs, Index, cntChars, TextHeight, CountPage : Integer; TextString : String; Size : TSize; TextMetric : TTextMetric; TextRect : TRect; StringDynArray : TStringDynArray; begin StringDynArray := nil; TextDC := CreateDC(nil, PChar(Printer), nil, nil); if TextDC <> 0 then begin // MaЯeinheit auf 1/10 mm und Koordinatensystem umstellen SetMapMode(TextDC, MM_LOMETRIC); // Seitenbreite und -hцhe ermitteln // Achtung: Angaben in mm PageW := GetDeviceCaps(TextDC, HORZSIZE); PageH := GetDeviceCaps(TextDC, VERTSIZE); // Создаем шрифт и применяем его к контексту устройства NewFont := CreateFont(36, 0, 0, 0, 400, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, 'Lucida Console'); OldFont := SelectObject(TextDC, NewFont); // Получаем метрики текста для текущего выбранного шрифта GetTextMetrics(TextDC, TextMetric); // Подготавливаем имя документа ZeroMemory(@DocInfo, SizeOf(DocInfo)); DocInfo.cbSize := SizeOf(DocInfo); DocInfo.lpszDocName := 'Документ'; // Подстраховка что многостраничный документ не будет разделен в очереди печати StartDoc(TextDC, DocInfo); // Выставляем прозрачность фона текста SetBkMode(TextDC, TRANSPARENT); Index := 1; // Номер первой страницы CountPage := 1; StringDynArray := Explode(#13#10, Text); for Paragraphs := 0 to length(StringDynArray) - 1 do begin TextString := StringDynArray[Paragraphs]; if TextString = '' then Continue; repeat // Seitenkopf MoveToEx(TextDC, BORDERLEFT * 10, - BORDERTOP * 10, nil); LineTo(TextDC, PageW * 10 - BORDERRIGHT * 10, - BORDERTOP * 10); TextRect.Left := BORDERLEFT * 10; TextRect.Top := - BORDERTOP * 10 + TextMetric.tmHeight; TextRect.Right := PageW * 10 - BORDERRIGHT * 10; TextRect.Bottom := TextRect.Top - TextMetric.tmHeight; DrawText(TextDC, PChar('Список загружаемых приложений'), Length('Список загружаемых приложений'), TextRect, DT_CENTER); // Text in Zeнlen umbrechen GetTextExtentExPoint(TextDC, PChar(TextString), length(TextString), (PageW * 10) - (BORDERLEFT * 10) - (BORDERRIGHT * 10), @cntChars, nil, Size); while (TextString[cntChars] <> ' ') do Dec(cntChars); // Text ausgeben // Achtung: Angaben in 1/10 mm TextOut(TextDC, BORDERLEFT * 10, - (BORDERTOP * 10) + - Index * (Size.cy - 10), PChar(TextString), cntChars); Delete(TextString, 1, cntChars); Inc(Index); // wenn Hцhe aller Zeilen grцЯer der Seitenhцhe, neu Seite anfangen TextHeight := Index * (TextMetric.tmHeight div 10) + BORDERTOP + BORDERBOTTOM; if TextHeight >= PageH - BORDERTOP - BORDERBOTTOM then begin // SeitenfuЯ MoveToEx(TextDC, BORDERLEFT * 10, - (PageH - BORDERTOP) * 10, nil); LineTo(TextDC, PageW * 10 - BORDERRIGHT * 10, - (PageH - BORDERTOP) * 10); TextRect.Left := BORDERLEFT * 10; TextRect.Top := - (PageH - BORDERTOP) * 10 - 10; TextRect.Right := PageW * 10 - BORDERRIGHT * 10; TextRect.Bottom := TextRect.Top - TextMetric.tmHeight; DrawText(TextDC, PChar(IntToStr(CountPage)), length(IntToStr(CountPage)), TextRect, DT_RIGHT); // neue Seite EndPage(TextDC); Inc(CountPage); // Zeilenzдhler zurьcksetzen Index := 1; end; until CntChars < 1; end; // SeitenfuЯ der letzten Seite MoveToEx(TextDC, BORDERLEFT * 10, - (PageH - BORDERTOP) * 10, nil); LineTo(TextDC, PageW * 10 - BORDERRIGHT * 10, - (PageH - BORDERTOP) * 10); TextRect.Left := BORDERLEFT * 10; TextRect.Top := - (PageH - BORDERTOP) * 10 - 10; TextRect.Right := PageW * 10 - BORDERRIGHT * 10; TextRect.Bottom := TextRect.Top - TextMetric.tmHeight; DrawText(TextDC, PChar(IntToStr(CountPage)), length(IntToStr(CountPage)), TextRect, DT_RIGHT); // Druck abschlieЯen EndDoc(TextDC); // ursprьngliche Schrift wieder in den DC selektieren SelectObject(TextDC, OldFont); // DC lцschen DeleteDC(TextDC); end else Messagebox(hApp, PChar(SysErrorMessage(GetLastError)), nil, MB_ICONSTOP); end; | Функция Explode как я понимаю возвращает количество печатаемых символов в тексте. Затем это все подается в TextOut. Теперь удалось уменьшить интервал между строками, но... текст не до конца страницы и сразу остаток его переносится на следующую страницу. |