Von WPTools4 auf WpTools8: Zugriff auf PTLine.pa bzw. TParagraph.CharAttr

  • Ich versuche gerade sehr alten Code von WPTools4 auf WPTools8 zu heben.

    Im wesentlichen dient der Code dazu einen Paragraph Zeichen für Zeichen durchzuscannen und
    Text mit gleichen Textattributen zusammengefasst als Text-Elemente für eine eigenes Format
    zu konvertieren.

    In WPTools4 konnte dazu für jedes Zeichen auf sein TAttr zugegriffen werden (siehe alter Code unten)

    Mittlwerweile sind diese Werte offenbar über CharAttr[i] zugreifbar. Allerdings nur als Index-Wert (Cardinal).

    Was ist nun die korrekte Methode, um vom CharAttr[i] auf die Textattribute zu kommen?


    • Offizieller Beitrag

    Der code zum zeichenweise auslesen der Attribute muss neu geschrieben werden, PTAttr gibt es nicht mehr.

    WPTools speichert seit V5 die Attribute mittels eines Zeichenattribute index wertes. Dieser wird in dem array par.CharAttr gespeichert.

    Das höchstwertigste byte von CharAttr wird für interne Zwecke verwendet, also bitte den Wert &FFFFFF nehmen.

    Diesen kann man dann WPRichText.AttributeHelper.CharAttr zuweisen und erhält über dieses Interface die Möglichkeit die Attribute auszulesen.

    Im Manual ist eine Einführung für die Datenstrukturen. Praktischerweise ist für gleiche Attribute der Wert vom CharAttr gleich. Dadurch muss man nur neu auswerten, wenn sich CharAttr ändert.

    pc^ kann einfach durch par.CharItem[i] ersetzt werden.

    pa^.width gibt es nicht mehr, dafür aber CharPos[i].Width

    Seit WPTools 5 werden die Zeilen nicht mehr umgebrochen in einzelne Blöcke innerhalb eines Absatzes. Stattdessen werden in par.Lines die Anfangsposition sowie die Länge jeder Zeile gespeichert.

    Im wesentlichen dient der Code dazu einen Paragraph Zeichen für Zeichen durchzuscannen und
    Text mit gleichen Textattributen zusammengefasst als Text-Elemente für eine eigenes Format
    zu konvertieren.

    Um ein eigenes Format zu realisieren würde ich aber eher einen writer programmieren. Der HTML writer aus WPIOHTML.pas kann hierfür als Vorbild dienen.

  • Danke. Das hat mich etwas weiter gebracht. Es sieht jetzt schon deutlich besser aus. Die Sache mit dem Writer schaue ich mir an, wenn das optische Ergebnis im bisherigen Ansatz einigermaßen stimmt.

    Ich bekomme jetzt die Text-Attribute über den AttributeHelper. Allerdings nicht immer. In einem Testbeipspiel erhalte ich für die Zeichen des ersten Paragraph
    in folgenden GetFontSize Aufruf ein False. Im nächsten Paragraph habe ich einen anderen Font und eine anderes Size gesetzt. Ab dort erhalte ich gültige FontSize-Wert.

    Wann passiert so etwas und wo bekomme ich dann alternativ meine FontSize her?

    Code
       if not aRichText.AttrHelper.GetFontSize(FontSize) then begin
          FontSize := 11;
          Assert(false);
       end;
    • Offizieller Beitrag

    Wenn AttrHelper.Get...() FALSE zurück liefert, ist das Attribut nicht an der Position des Zeichens nicht definiert sondern wird geerbt, vom Absatz vom Absatzstil oder von WPRichText.DefaultAttr, in dieser Reihenfolge.

    Um die Schriftgrösse des Absatzes (bzw. Stiles) auszulesen kann man

    value := par.AGetDefInherited( WPAT_FontSize, DefaultFontSize )

    verwenden. Dieser code müsse dann also in dem FALSE zweig ausgeführt werden.

  • Hat leider noch nicht funktioniert.

    Der folgende Code liefert nur den Default-Wert zurück, aber nicht den korrekten Wert.

    Code
    function EntityDataFromAttr(aRichText: TWPRichText;
       Par: TParagraph; aPt: TPoint; aRightX: longint; aStr: string): TEntityData;
    var
       FontSize : single;
       DefaultFontSize : Integer;
    ...
    begin   if not aRichText.AttrHelper.GetFontSize(FontSize) then begin
          FontSize := par.AGetDefInherited(WPAT_CharFontSize, 1101) / 100;
       end;
  • Vielen Dank.

    Die Übertragung in unser Darstellungsformat sieht jetzt schon deutlich besser aus.

    Farbe, Fontsize, Fontname werden jetzt in unserem Zeichnungsformat korrekt dargestellt.

    Die Positionen der Texte sind fast richtig. Was mir aufgefallen ist: Schon im Rtf-Dialog von WPTools
    ist die Formatierung in gleicher Weise verschoben wie bei den von uns konvertierten Text-Elementen.
    Die Konvertierung scheint also okay zu sein. Allerdings ist die rechte Texttbegrenzung im alten Programm
    geringfügig anders (WPTools4 so ca. 7,8 cm, mit WPTools8 so ca. 8,2cm).

    Ist da etwas bekannt? Das kann natürlich auch eine Änderung in unserem Code sein. Ich suche da noch,
    bin aber für Tipps dankbar.