Graf odvisnosti izračunov obrazca
HotPDF zgradi graf odvisnosti nad polji izračuna naloženega AcroForm, tako da sprememba vrednosti ponovno izračuna le tiste izračune, ki jo transitivno berejo, v vrstnem redu, kjer je vsaka ponovno izračunana vrednost že vidna izračunom, ki jo porabijo
Izgradnja grafa
THotPDF.BuildLoadedFormCalculationGraph vrne posnetek v lasti klicatelja. Vsako polje postane vozlišče; vsak skript Calculate, registriran z /CO, se statično analizira z HPDFExtractSafeJavaScriptFieldReferences, ki prebere imena polj, ki jih skript varno podmnožico dotakne: navedene argumente AFSimple_Calculate("OP", ["a","b"]) in navedena imena dostopov getField("x"), pri čemer se nizovni literali preskočijo, tako da besedilne omenitve niso obravnavane kot sklice
THPDFFormCalcGraph.ResolveLinks razreši ta imena v povezave izvor → odvisen in uredi cilje s topološkim razvrščanjem. Polja na ciklu odvisnosti ohranjajo vrstni red /CO dokumenta namesto tega, kar ustreza semantikam enopasovnega izračuna; sprememba polja nikoli ne ponovno izračuna lastne skripte, zato se cikli ne morejo ping-pongati in vrednost, napisana uporabnikom, vedno zmaga. Imena virov, ki ne ujemajo z nobenim poljem, se poročajo prek UnresolvedFieldNameCount in ne ustvarijo povezav, kar odražava izvajalni razreševalnik
Inkrementalno ponovno izračunavanje
RecalculateLoadedFormFieldsIncremental ocenjuje le vplivno zaprtje danih spremenjenih polj. Zapisovanja prek SetFormFieldValue in SetLoadedFormFieldValueByName zbirajo nečisto množico; preobtežena različica brez parametrov ponovno izračuna iz te množice, tako da uvoz FDF ali XFDF, sleden eno inkrementalno potjo, osveži vsak odvisen izračun brez dotikanja nepovezanih. Tako preobtežene različice kot polna pot RecalculateLoadedFormFields nato porabijo nečisto množico
PDF.LoadFromFile('Order.pdf');
PDF.SetLoadedFormFieldValueByName('qty', '3');
PDF.SetLoadedFormFieldValueByName('price', '19.5');
// Ponovno izračuna samo podskupino in skupno vsoto, zvezano v eni poti
PDF.RecalculateLoadedFormFieldsIncremental(['qty', 'price']);
Pregled grafa
Graf izpostavlja stanje izračuna po polju (GetNode), celotno zaporedje ocenjevanja (AllTargets), vplivno zaprtje (AffectedTargets), število ciljev na ciklih (CyclicTargetCount) in nerazrešena imena virov, tako da orodja lahko predogledajo točno, katere izračune bo sprememba sprožila