Grafo de dependencias de cálculo de formularios

HotPDF construye un grafo de dependencias sobre los campos de cálculo de un AcroForm cargado para que un cambio de valor recalcule solo los cálculos que lo leen transitivamente, en un orden donde cada valor recalculado ya es visible para los cálculos que lo consumen

Construcción del grafo

THotPDF.BuildLoadedFormCalculationGraph devuelve una instantánea propiedad del llamador. Cada campo se convierte en un nodo; cada script Calculate registrado en /CO se analiza estáticamente con HPDFExtractSafeJavaScriptFieldReferences, que lee los nombres de campo que toca un script de subconjunto seguro: los argumentos entre comillas de AFSimple_Calculate("OP", ["a","b"]) y los nombres entre comillas de los accesos getField("x"), omitiendo los literales de cadena para que las menciones textuales no se traten como referencias

THPDFFormCalcGraph.ResolveLinks resuelve esos nombres en aristas source → dependent y ordena los destinos con una ordenación topológica. Los campos en un ciclo de dependencia conservan en su lugar el orden de documento /CO, lo que coincide con la semántica de una sola pasada de un recálculo completo; un campo cambiado nunca recalcula su propio script, por lo que los ciclos no pueden rebotar y un valor escrito por el usuario siempre gana. Los nombres de origen que no coinciden con ningún campo se informan mediante UnresolvedFieldNameCount y no producen aristas, reflejando el resolutor de tiempo de ejecución

Recálculo incremental

RecalculateLoadedFormFieldsIncremental evalúa solo el cierre afectado de los campos cambiados dados. Las escrituras mediante SetFormFieldValue y SetLoadedFormFieldValueByName acumulan un conjunto sucio; la sobrecarga sin parámetros recalcula a partir de ese conjunto, de modo que una importación FDF o XFDF seguida de una pasada incremental refresca cada cálculo dependiente sin tocar los no relacionados. Ambas sobrecargas y la pasada completa de RecalculateLoadedFormFields consumen el conjunto sucio después

PDF.LoadFromFile('Order.pdf');
PDF.SetLoadedFormFieldValueByName('qty', '3');
PDF.SetLoadedFormFieldValueByName('price', '19.5');
// Recomputes subtotal and total only, chained in one pass
PDF.RecalculateLoadedFormFieldsIncremental(['qty', 'price']);

Inspección del grafo

El grafo expone el estado de cálculo por campo (GetNode), la secuencia completa de evaluación (AllTargets), el cierre afectado (AffectedTargets), el número de destinos en ciclos (CyclicTargetCount) y los nombres de origen no resueltos, de modo que las herramientas puedan previsualizar exactamente qué cálculos activará una edición