Problem bei AppendTextObject('PAGE');

  • Hallo,

    zum Ermitteln der Seite zu einer Tabellenzeile funktioniert AppendTextObject('PAGE') hervorragend, ich hänge es an die erste Zelle einer Tabellenzeile an.

    Nun gibt es aber ein kleines Problem, wo ich hoffe, eine Lösung zu bekommen:

    Eine Tabellenzelle kann mehrzeiligen Text enthalten (z.B. den Text zur Position der Rechnung), die letzte Tabellenzelle enthält den Gesamtpreis.


    Dieser ist aber, vom Anwender gewünscht, unten in der Zelle angeordnet.

    Wenn diese Tabellenzeile nun über den Seitenwechsel geht, stehen z.B. 3 Zeilen Text auf Seite 3 und weitere 2 Zeilen auf Seite 4.

    Der Gesamtpreis steht auch auf Seite 4, über AppendTextObject('PAGE') aber bekomme ich den Beginn der Zelle (also Seite 3).

    Gibt es eine einfache Abfragemöglichkeit, ob die betreffende Zelle oder Zeile über einen Seitenwechsel geht?

    Danke

    Ciao
    Stefan

    • Offizieller Beitrag

    Wichtig: WPTools (5 und später) verwendet keine Strukturen die Seiten direkt zugeordnet werden. Es ist komplexer, es gibt Seiten mit Ausgabeobjekten welche dem Text in Absätzen zugeordnet werden. Damit kann der Text eines Absatzes auch auf mehreren Seiten erscheinen, was bei Kopf und Fusstext, aber auch bei Tabellen köpfen und -Füssen regelmässig der Fall ist. Daher kann ich die Frage nicht allgemein gültig beantworten.

    Generell kann man aber für jede Zeile eines Absatzes abfragen auf welcher Seitennummer sie ausgegeben wurde mittels einer recht komplexen funktion des TParagraph: function LinePageNr(lin: Integer): Integer;

    Wie ich bereits früher schrieb, sollten Sie dynamischen Text mittels Ausgabeobjekten drucken. Diese Ausgabeobjekte müssen die aktuelle Seite vor der Ausgabe (oder dem Druck) auswerten, nicht bei der Formattierung. Die Berechnung passiert also in der paint routine!

    Dies ist code aus der Demo: WPReporter_Calc

    In dem Paintcalc event des controls TWPFormulaInterface bekommt man auch die aktuelle Seite und sogar eine Referenz auf Zeichenunterlage "page". Der Code zeigt wie dort alle Felder ausgewertet werde. Dies können auch unsichtbare Felder sein um die vorherigen Summen auszuwerten.

    Sie können also in jeder Ihrer Tabellenreihen die aktuelle Summe abspeichern, ähnlich einem laufenden Kontostand auf einem Bankauszug.

    Wenn man das TWPFormulaInterface nicht zur Verfügung hat, kann man auch OnTextObjectPaint verwenden.

    procedure TForm1.WPRichText1TextObjectPaint(Sender: TObject; pobj: TWPTextObj;

    toCanvas: TCanvas; XRes, YRes, X, Y, W, H, BASE: Integer;

    PageRef: TWPVirtPage; Modes: TWPTextObjectPaintModes;

    const CanvasExtraAttr: TWPPaintExtraParams;

    var ContinueMode: TWPTextObjectPaintResult);

    und dort PageRef bzw PageRef.pagenr.

  • Zitat

    Sie können also in jeder Ihrer Tabellenreihen die aktuelle Summe abspeichern, ähnlich einem laufenden Kontostand auf einem Bankauszug.

    danke, das wäre natürlich auch eine Idee, da muss ich mal drüber nachdenken!

    Dann müssten z.B. bei Änderung in Zeile 23 aber alle nachfolgenden Zeilen entsprechend aktualisiert werden, was bei 250 Seiten a' 40 Tabellenzeilen dauern kann...

    Ich denke über einen Thread im Hintergrund nach, der die Seitensummen berechnet und die Summen dann dem TextObjectPaint zur Verfügung stellt.

    Vor der Ausgabe oder dem Druck muss ich mal sehen ob das machbar ist...
    Im Prinzip sollen die Seitenüberträge ständig aktuell sein, d.h. bei jedem Tastendruck könnte ja eine Zeile höher werden oder sich ein Einzelpreis (und damit der Gesamtpreis) ändern.

    Ein TextObjectPaint wird aber nur gefeuert, wenn das entsprechende Objekt in den "Sichtbereich kommt", bzw. die Seite gedruckt wird, richtig?

    Ciao

    Stefan

    • Offizieller Beitrag

    Ein neu kalkulieren bleibt einem nie erspart. Irgendwo muss die gesamt summe ja herkommen. Das Datenfeld muss auch nicht die tatsächliche Summe sein, sondern kann auch eine Referenz auf ein "Rechenblatt" ausserhalb sein.

    Ja, der event kommt nur bei der Ausgabe, sonst nicht. Das ist auch gerade der Witz und darum ist das System schnell. Für Berechnungen ist das Ereignis nicht zu gebrauchen.

    Ich denke Rechnungen mit 250 Seiten dürften auch eher unüblich sein. Hierfür braucht man besondere Lösungsansätze

    Wenn es Flaschenhälse gibt, liegen die vermutlich woanders. Ein Thread der im Hintergrund die Seiten abfragt, das wird recht interessante Fehler verursachen.

    WPTools ist zwar thread save, aber nicht als Editor sondern als document creator (TCustomRTFEdit) in seinem eigenen environment. In dem selben environment dürfen nicht mehrere threads gleichzeitig auf den Text zugreifen.