Abhängigkeitsgraph für Formularberechnungen
HotPDF erstellt einen Abhängigkeitsgraphen über die Berechnungsfelder eines geladenen AcroForm, sodass eine Wertänderung nur die Berechnungen neu ausführt, die sie transitiv lesen, und zwar in einer Reihenfolge, in der jeder neu berechnete Wert bereits für seine Verbraucher sichtbar ist
Graphaufbau
THotPDF.BuildLoadedFormCalculationGraph liefert einen Snapshot im Eigentum des Aufrufers. Jedes Feld wird zu einem Knoten; jedes über /CO registrierte Calculate-Skript wird statisch mit HPDFExtractSafeJavaScriptFieldReferences analysiert, das die Feldnamen liest, die ein Safe-Subset-Skript berührt: die quotierten Argumente von AFSimple_Calculate("OP", ["a","b"]) und die quotierten Namen von getField("x")-Zugriffen; String-Literale werden übersprungen, damit textuelle Erwähnungen nicht als Verweise gelten
THPDFFormCalcGraph.ResolveLinks löst diese Namen in source → dependent-Kanten auf und ordnet die Ziele per topologischer Sortierung. Felder in einem Abhängigkeitszyklus behalten stattdessen die /CO-Dokumentreihenfolge und spiegeln so die Ein-Durchlauf-Semantik einer vollständigen Neuberechnung; ein geändertes Feld berechnet nie sein eigenes Skript neu, Zyklen können also nicht pendeln, und ein benutzergeschriebener Wert gewinnt immer. Quellnamen ohne Feldtreffer werden über UnresolvedFieldNameCount gemeldet und erzeugen keine Kanten, wie der Laufzeit-Resolver
Inkrementelle Neuberechnung
RecalculateLoadedFormFieldsIncremental wertet nur den betroffenen Abschluss der angegebenen geänderten Felder aus. Writes über SetFormFieldValue und SetLoadedFormFieldValueByName summieren eine Dirty-Menge; die parameterlose Überladung berechnet aus dieser Menge neu, sodass ein FDF- oder XFDF-Import, gefolgt von einem inkrementellen Durchlauf, jede abhängige Berechnung auffrischt, ohne unbeteiligte anzutasten. Beide Überladungen und der vollständige RecalculateLoadedFormFields-Durchlauf verbrauchen die Dirty-Menge danach
PDF.LoadFromFile('Order.pdf');
PDF.SetLoadedFormFieldValueByName('Quantity', '2');
PDF.RecalculateLoadedFormFieldsIncremental;Graph-Inspektion
Der Graph legt den Berechnungszustand je Feld offen (GetNode), die vollständige Auswertungssequenz (AllTargets), den betroffenen Abschluss (AffectedTargets), die Anzahl der Ziele in Zyklen (CyclicTargetCount) und unaufgelöste Quellnamen, sodass Werkzeuge genau vorab sehen können, welche Berechnungen eine Änderung auslöst