WPTools5: Die Höhe eines Textes bestimmen

  • Gruezi

    Ich habe im WPTools3 eine Routine geschrieben, welches die effektive Höhe das ganzen Textes bestimmt.

    Nach Anpassungen an WPTools5 (Version 5.18..6d +premium Demo) sieht die Routine so aus:

    Zu berücksichtigen gilt, das wenn man zB eine Tabelle mit einer Zeile und 4 Spalten hat, die Höhe 4 Mal zu hoch ist. Das habe ich in der Routine eingebaut.

    So, jetzt habe ich folgende Fragen zu WPTools5:

    1.
    Gibt es in WPTools5 eine einfachere Methode, um die Höhe zu berechnen?

    2.
    Ist eine Zeile leer, gibt lin.height leider immer den Wert 0 zurück.
    Das mag ja noch gut sein, wenn man noch überhaupt keinen Text eingeben hat. Aber spätestens nach dem drücken der Return-Taste, müsste die erste Zeile eine Höhe>0 haben.
    Gebe ich in der ersten Zeile ein Zeichen ein, dann hat lin.height den Wert 106 (bei einer Schriftgrösse 11). Lösche ich das Zeichen wieder, bleibt der Wert bei 106. Nur beim ersten Erstellen einer Zeile habe ich statt den Wert 106 leider den Wert 0.

    Folgendes Beispiel dazu:
    In einem leeren TWPRichText drücke ich 5 Mal die Return Taste und dann die Taste 'a'.
    Eigentlich müsste jetzt die Höhe dieses Textes 6x106 als 636 betragen. Ich bekomme aber nur den Wert 106 zurück.

    Was mir auch noch dabei aufgefallen ist: Sobald ich ein Zeichen in eine leere Zeile eingebe, rutschen die unteren Zeilen um ca. einen Pixel nach unten. Warum? eine leere Zeile und eine nicht leere Zeile müsste doch die gleiche Höhe haben.

    3.
    Gibt es noch weitere Unterschiede zwischen WPTools3 und WPTools5 die man beachten muss, um die Höhe zu berechnen?


    Schon mal vielen Dank für die Beantwortung meiner Fragen.
    Ich möchte nämlich gerne auf die Version 5 updaten, wenn es nicht zu viele Zeit beansprucht, mein Programm anzupassen.

  • Leider scheint kein WPSupporter meine Fragen beantworten zu wollen.
    Wie lange sind so die Reaktionszeiten in diesem Forum?


    Zurück zum Thema.

    Folgendes ist mir noch aufgefallen.

    Bei WPTools Version 3 gibt TLine.Height die komplette Höhe zurück. Werden Paragraph Formate wie before/after spacing verwendet, so werden die in TLine.Height integriert. Ausserdem scheint der Wert in der Einheit Twip zu sein.

    Bei WPTools Version 5 hat TLine.Height immer den selben Wert. Egal wie gross/klein man den Spacing Wert verändert. Ausserdem ist der Wert viel kleiner als dass es sich um einen Twip Wert handeln könnte.

    Ich wäre immer noch sehr dankbar für eine Antwort.

    • Offizieller Beitrag

    Reaktionszeit in diesem oberen Foren sehr gut - diese hier wird leider machmal übersehen. Zum Glück gibt es ja auch e-mail.

    WPTools 3/4 hat den Text ganz anders formatiert als version 5. In der alten version wurde eine absatz/zeilen list generiert und jede Zeiule hatte eine faste hähe. Anhand der Höhe wurden dann die Seitenumbrüche generiert.

    Version 5 arbeitet ganz anders - es gibt keine Zeilen strukturen mehr. Die komponenente merkt sich lediglich wo auf einer virtuellen Seite welcher Teil eines Absatzes gedruckt werden soll. Dabei ist es durchaus üblich dass auf verschiedenen Seiten dieselben texte gedruckt werden - so zum beispiel Kopf und Fusstexte.

    Version 5 emuliert einige der properties dennoch wird man für einige Problem neue lösungen finden müssen. Die Funktion wird so nicht mehr funktionieren, paprIsRightPar und paprIsLeftPar prüft lediglich ob es sich um eine recht oder linke zelle handelt. Früher hatten diese Flags eine wichtige Bedeutung beim aufbau einer Tabelle. Heute Sind zellen jedoch echte objekte wie sich aus dem Manual ergibt (s. Datenstrukturen).

    Grundsätzlich sind die Zeilen nicht zu gebrauchen wenn der Text nicht formattiert ist. Line.Height benutz die Auflösung der Renderingengine, diese ist 600. (Memo.CurrentYPixelsPerInch)

    Die Höhe des gesamten Textes kann man so ermitteln:

    WPRichText1.Memo.DeskHeight

    in Bildschirm pixels

    Die Höhe des Textes ohne leerbereiche gibt

    WPRichText.BodyText.Height zurück. Dieser wert in 600dpi (normalerweise. s.o.)

    Grüsse,

    J. Ziersch

  • Zuerst einmal vielen Dank für die Antwort.

    Arbeitet Version 5 intern standardmässig mit 600 dpi oder mit 1440 dpi (Twips)? Werden 1440 dpi nur für Kompatibilität zu Version 3/4 verwendet.

    Da man ja zum Teil kompatible sein muss mit älteren Versionen, gibt es doch zum Teil ein durcheinander mit den Einheiten.

    So zum Beispiel Header.PageHeight in 1440 dpi.
    WPRichText.BodyText.Height in 600 dpi.
    und WPRichText1.Memo.DeskHeight in Pixel.

    Gibt es zB auch einen PageHeight Funktion, die den Wert in 600 dpi zurückgibt?

    Um möchliche Rundungsfehler auszuschliessen, möchte ich nur in der native Einheit rechnen.

    Bei Version 3 habe ich meinen eigenen Reporter geschieben.
    Da die Anpassungen auf Version 5 doch grösser sind, habe ich mir überlegt, ob ich meinen Reporter über Bord schmeissen soll und statt dessen den WPReporter verwende. Doch mein Reporter hat zwei Funktionen, die der WPReporter bis jetzt noch nicht bietet:

    1. Bänder nach unten ausrichten (zB für Einzahlungsscheine am Ende einer Rechnung oder Fusszeile nur auf letzter Seite)

    2. Verschmelzen von Bändern. (zB soll Band1 bei einem Seitenumbruch nicht mit Band2 getrennt werden. Damit kann man verhindern, dass zB eine Titelzeile alleine zuunterste auf der Seite steht).

    Also, wenn WPTools native mit 600 dpi arbeitet, dann müsste ich folgendes wissen:

    1.
    Seitenhöhe und Ränder in 600 dpi

    2.
    Die Gesamthöhe der einzelenen Bänder nach dem Mergen.
    Dazu könnte ich ein Band in ein leeres WPRichText kopieren, mergen und mit WPRichText.BodyText.Height die Höhe auslesen.

    3.
    Die minimale Trennhöhe eines Bandes.
    Damit meine ich, wenn ein Band wegen eines Seitenumbruches getrennt wird, bei welcher Höhe kann ich das erste Mal ein Band trennen. Meisten entspricht das der Höhe der ersten Zeile.

    4.
    Die schwierigste Funktion, finde ich, ist das trennen von Bändern.
    Ich habe ein Band das zB 2400 (4 inch) hoch ist aber ich habe nur noch 1500 (2.5 inch) platz auf der Seite.
    Ich kopierte bis jetzt das Band in ein leeres WPRichtext und kopierte Zeile für Zeile bis zur Höhe von 1500 in ein zweite WPRichtext. Den Rest kopierte ich in ein drittes WpRichText. Dann wieder die exakte Höhe vom zweiten und dritten WPRichtext bestimmen (zB. 1420 und 980).


    Viel mehr braucht man nicht, um selber einen Reporter zu basteln.

    Aber ich habe ja schon Probleme, wenn ich die Höhe einer einzelnen Zeile bestimmen will.
    Wenn eine Zeile zB ein Spacing muliple 2.0 hat, mit welchem Befehl bekomme ich die Höhe des Textes inklusive dem Spacing in 600 dpi?
    Wenn man die Line Geschichte nicht mehr verwenden soll, wie erkenne ich dann auf welcher Zeile ich mich befinde?

    Gruss

    • Offizieller Beitrag

    Hallo,

    >>1. Bänder nach unten ausrichten (zB für Einzahlungsscheine am Ende einer Rechnung oder Fusszeile nur auf letzter Seite) <<

    Das wird anders gelöst. In die Fusszeile kann man ein textfeld plazieren welches dann zur paint-zeit die richtige summe aus dem inhalt der Seite ermittelt.

    >>2. Verschmelzen von Bändern. (zB soll Band1 bei einem Seitenumbruch nicht mit Band2 getrennt werden. Damit kann man verhindern, dass zB eine Titelzeile alleine zuunterste auf der Seite steht).<<
    Da WPTools 5 eachte titel zeilen hat (in der tabelle) ist man normalerweise sichher dass eine soche nicht am ende einer seite steht. Dasselbe auch für tabellenfüsse, einer wptools spezialität.

    >>Also, wenn WPTools native mit 600 dpi arbeitet, dann müsste ich folgendes wissen: <<
    Nein, es rechnet mit 600dpi, alternativ kann es auch mit Bildschirmausflösung rechnen, wird im Manual unter "WYSIWYG" beschrieben.

    WPTools ist auf RTF ausgelegt welches für den Dokumentenaustausch immer noch optimal ist. RTF werte basieren alle(!) auf twips, also 1440dpi.

    >>1.
    Seitenhöhe und Ränder in 600 dpi

    Muss man wohl oder übel umrechnen, MulDiv( twips, 600, 1440)

    >>2.
    Die Gesamthöhe der einzelenen Bänder nach dem Mergen.
    Dazu könnte ich ein Band in ein leeres WPRichText kopieren, mergen und mit WPRichText.BodyText.Height die Höhe auslesen. <<

    Dazu kann ich nichts sagen, für derartige Manipulationen ist das Konzept nicht ausgelegt. Das gilt für 3. und 4. Sowas war mit dem alten Konzept relativ einfach, in V5 sollte man es vergessen.

    Viele Grüsse,

    Julian Ziersch

    - Das Büro ist nun bis 22.1 geschlossen -