Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Exakte Druckposition der letzten RichEdit-Zeile herausfinden (https://www.delphipraxis.net/116821-exakte-druckposition-der-letzten-richedit-zeile-herausfinden.html)

gullatrulla 7. Jul 2008 09:53


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]

marabu 7. Jul 2008 10:16

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

gullatrulla 7. Jul 2008 10:23

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

marabu 7. Jul 2008 10:30

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 hinzufügst.

gullatrulla 7. Jul 2008 10:40

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

marabu 7. Jul 2008 11:27

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.

gullatrulla 7. Jul 2008 16:09

Re: Exakte Druckposition der letzten RichEdit-Zeile herausfi
 
Herzlichen Dank für Deinen Tipp
Ich versuchs mal.

Gruss Roland

Flocke 8. Jul 2008 19:07

Re: Exakte Druckposition der letzten RichEdit-Zeile herausfi
 
Zitat:

Zitat von gullatrulla
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?

Auch die gibt es, obwohl dazu heutzutage nichts mehr im MSDN zu finden ist. Du kannst dazu die Kombination von EM_FORMATRANGE(0)/EM_DISPLAYBAND nutzen - Beispiel:
Delphi-Quellcode:
//----------------------------------------------------------------------
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;
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz