.... und noch ein UpDate:
Gestern beim herumspielen mit TPrintPreview (arbeitet mit TCustomRichEdit) ist mir plötzlich aufgefallen, das RichEdit offensichtlich doch einen Seitenumbruch beherscht - allerdings nur via Control '\page' und NICHT per '\pagebb'.
Zur Erinnerung:
... ich wollte mit LibreOffice erstellte Seiten auch so wie generiert mit Seitenumbruch anzeigen/drucken.
LO baut allerdings in den Plaintext ein PageBreakBefore ein. Keine Ahnung ob MS-Office oder andere Text-Proggies das auch so machen, ich hab z.Zt. kein anderes.
Das vereinfacht die Sache natürlich nochmals. Man muss nun nach wie vor im Plaintext nach '\pagebb' suchen, braucht aber nichts einzubauen und wieder darauf zu testen o. ä., sondern einfach nur mit '\page' ersetzen.
Ich kam drauf, weil ich eine meiner Test-Dateien schon manuell daraufhin editiert hatte...
Delphi-Quellcode:
// -----------------------------------------------------------------------------
// GLOBAL: FFrameRect, RichEdit
procedure TMainForm.RenderRichEdit(Files : TStringList);
var
SS : TStringStream;
RTFplain : ANSIString;
// fails if wide string !!!
i : integer;
Offset : Integer;
begin
CalcFrame;
// set print-rectangle with given borders
PrintPreview.Units := mmHiMetric;
// All units are in 1/100th of millimeter
PrintPreview.BeginDoc;
// ... loop the files
for I := 1
to Files.Count
do
begin
if (i > 1)
then
PrintPreview.NewPage;
// new file -> new page
// ----- check for PrintPageBefore
SS := TStringStream.Create('
');
// ... load file to stream and copy to ANSI-STRING !!! (NOT WIDE)
SS.LoadFromFile(Files[i-1]);
SetLength(RTFplain, SS.Size);
SS.
Read(RTFplain[1], SS.Size);
// ... replace \pagebb with '\page'
RTFplain := StringReplace(RTFplain, '
\pagebb', '
\page', [rfReplaceAll]);
SS.Clear;
SS.WriteBuffer(RTFplain[1],Length(RTFplain));
// load plain back to stream
SS.Position := 0;
RichEdit.Lines.LoadFromStream(SS);
// load stream to RTF
SS.Free;
// -----
// render RTF (similar as in org. TPrintPreview 'RichTextDemo')
Offset := 0;
while (Offset >= 0)
and
(PrintPreview.PaintRichText(FFrameRect, RichEdit, 1, @Offset) <> 0)
do
begin
Application.ProcessMessages;
if (Offset >= 0)
then
PrintPreview.NewPage;
end;
end;
PrintPreview.EndDoc;
end;
Es fehlte übrigends noch der 'Seitenvorschub', wenn mehr als eine Datei aus der FileList gedruckt wurde.