![]() |
Exakte Druckposition der letzten RichEdit-Zeile herausfinden
Hallo Delphi-Folks
Ich möchte ein mehrseitiges RTF-Dokument drucken. Soweit gemäss untenstehender Source kein Problem
Delphi-Quellcode:
//----------------------------------------------------------------------
//----------------------------------------------------------------------
Printer.BeginDoc; ... SendMessage(Handle, EM_FORMATRANGE, 0, 0); try repeat chrg.cpMin := LastChar; LastChar := SendMessage(Self.Handle, EM_FORMATRANGE, 1, Longint(@Range)); if (LastChar < MaxLen) and (LastChar <> -1) then begin NewPage; Inc(PageCountRich); end; until (LastChar >= MaxLen) or (LastChar = -1); finally SendMessage(Handle, EM_FORMATRANGE, 0, 0); SetMapMode(hdc, OldMap); end; Printer.EndDoc; Nun sollte ich nach der letzten Zeile des RTF-Dokuments noch zusätzlich eine Zeile drucken. Gibt es eine Möglichkeit die exakte Pixel-Druckposition der letzten RTF-Zeile zu ermitteln, damit die "manuelle" Zeile exakt unterhalb des RTF-Dokuments gedruckt werden kann? Herzlichen Dank für Eure Hilfe Roland [edit=Sharky][Delphi]-Tags gesetzt. Mfg, Sharky[/edit] |
Re: Exakte Druckposition der letzten RichEdit-Zeile herausfi
Hallo Roland,
am bequemsten gibst du ein mehrseitiges RTF-Dokument mit Fußtext sicher über einen Report aus, egal ob Seitenfuß oder Reportfuß. Du schreibst, dass du eine Schlußzeile unter deinem Dokument ausgeben möchtest. Wenn du das mit EM_FORMATRANGE machen möchtest, dann könntest du den zu druckenden Schlusstext einfach an das Ende des Dokuments im RichEdit schreiben, bevor du das Dokument dann renderst. Grüße vom marabu |
Re: Exakte Druckposition der letzten RichEdit-Zeile herausfi
Hi marabu
Danke für den Tip. Ich habe auch schon daran gedacht die Zeile vor dem Druck einzufügen. Dies würde insofern auch funktionieren. Leider sollten innerhalb dieser "manuellen" Zeile noch mehrer Tabulatorpositionen gesetzt werden (rechts- UND linksbündig). Ich habe jedoch noch nicht herausgefunden wie ich innerhalb einer Richedit-Komponente rechts und linksbündige Tabulatorpositionen setzen kann (innerhalb der gleiche Zeile!) Herzliche Grüsse Roland |
Re: Exakte Druckposition der letzten RichEdit-Zeile herausfi
Du könntest dir das Leben sehr leicht machen, indem du die Zeile samt Tabulatoren in einem Word-Processor entwirfst, dann als RTF-Dokument speicherst und den RichText dann als Literal - evtl. mit Format() - deinem Dokument
![]() |
Re: Exakte Druckposition der letzten RichEdit-Zeile herausfi
Word-Processor??
Meinst Du Word im Hintergrund öffnen --> Zeile generieren --> Dokument speichern und in RTF einfügen? Leider habe ich ca 80 unterschiedliche Dokumente auszudrucken. Ich kann mir vorstellen, dass diese Prozedur sehr zeitanwendig wird. Gruss Roland |
Re: Exakte Druckposition der letzten RichEdit-Zeile herausfi
Ich dachte eher daran, Word o.ä. einmal zur Entwurfszeit zu benutzen und das Ergebnis - z.B. als FormatString - im Projekt zu verwenden.
Das wäre ein alternativer Ansatz zu einigen Zeilen API-Programmierung. |
Re: Exakte Druckposition der letzten RichEdit-Zeile herausfi
Herzlichen Dank für Deinen Tipp
Ich versuchs mal. Gruss Roland |
Re: Exakte Druckposition der letzten RichEdit-Zeile herausfi
Zitat:
Delphi-Quellcode:
Sicher musst du damit noch ein bisschen herumprobieren. Ich benutze es, um damit einzelne (stellenweise mehr als 2000) RTF-Fragmente zusammen mit Kapitel- und Abschnittsüberschriften wie Fließtext als ein Dokument auszudrucken.
//----------------------------------------------------------------------
Printer.BeginDoc; ... SendMessage(Handle, EM_FORMATRANGE, 0, 0); try Range.rcPage := Range.rc; // Rechteck merken, falls nicht bereits geschehen repeat chrg.cpMin := LastChar; Range.rc := Range.rcPage; // Rechteck wiederhestellen LastChar := SendMessage(Self.Handle, EM_FORMATRANGE, 0, LParam(@Range)); SendMessage(Self.Handle, EM_DISPLAYBAND, 0, LParam(@Range.rc)); { In Range.rc.bottom steht jetzt die unterste Pixelposition, bis zu der etwas gedruckt wurde. } if (LastChar < MaxLen) and (LastChar <> -1) then begin NewPage; Inc(PageCountRich); end; until (LastChar >= MaxLen) or (LastChar = -1); finally SendMessage(Handle, EM_FORMATRANGE, 0, 0); SetMapMode(hdc, OldMap); end; Printer.EndDoc; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz