Graf zależności obliczeń formularza

HotPDF buduje graf zależności nad polami obliczeń załadowanego AcroForm, więc zmiana wartości przelicza tylko te obliczenia, które przechodnio ją czytają, w kolejności, w której każda przeliczona wartość jest już widoczna dla obliczeń, które ją zużywają

Konstrukcja grafu

THotPDF.BuildLoadedFormCalculationGraph zwraca migawkę należącą do wywołującego. Każde pole staje się węzłem; każdy skrypt Calculate zarejestrowany w /CO jest statycznie analizowany z HPDFExtractSafeJavaScriptFieldReferences, które czyta nazwy pól, których dotyka skrypt z bezpiecznego podzbioru: cytowane argumenty AFSimple_Calculate("OP", ["a","b"]) i cytowane nazwy dostępu getField("x"), z pomijaniem literalnych łańcuchów, więc tekstowe wzmianki nie są traktowane jako referencje

THPDFFormCalcGraph.ResolveLinks rozwięzi te nazwy na krawędzie źródło → zależny i porządkuje cele sortowaniem topologicznym. Pola na cyklu zależności zachowują zamiast tego kolejność dokumentu /CO, dopasowując się do semantyki pełnego przeliczenia w jednym przebiegu; zmienione pole nigdy nie przelicza własnego skryptu, więc cykle nie mogą odbijać się w przód i w tył, a wartość wpisana przez użytkownika zawsze wygrywa. Nazwy źródłowe, które nie pasują do żadnego pola, są raportowane przez UnresolvedFieldNameCount i nie tworzą krawędzi, odzwierciedlając rozwiązywacz czasu wykonania

Przeliczanie przyrostowe

RecalculateLoadedFormFieldsIncremental ocenia tylko dotknięte domknięcie podanych zmienionych pól. Zapisy przez SetFormFieldValue i SetLoadedFormFieldValueByName gromadzą zbiór brudny; przeciążenie bez parametrów przelicza z tego zbioru, więc import FDF lub XFDF, po którym następuje jeden przyrostowy przebieg, odświeża każde zależne obliczenie bez dotykania niepowiązanych. Oba przeciążenia i pełny przebieg RecalculateLoadedFormFields zużywają poźniej zbiór brudny

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']);

Inspekcja grafu

Graf wystawia stan obliczeń per pole (GetNode), pełną sekwencję oceny (AllTargets), dotknięte domknięcie (AffectedTargets), liczbę celów na cyklach (CyclicTargetCount) i nierozwiązane nazwy źródłowe, dzięki czemu narzędzia mogą podglądać dokładnie, które obliczenia wyzwoli edycja