Dynamisk XFA Instance Presentation

Unit: HPDFXFAPresentation

TXFAInstancePresentation ejer en uafhængig TXFAWidgetRuntime og tilføjer en afgrænset instance-præsentationsprofil til XDP-pakke-dokumenter med ét datasets-record

Brug SetPresence('row[1]', 'hidden') til at fjerne én occurrence fra flow, invisible til at beholde dens plads, mens dens widgets skjules, og visible til at gendanne den; indeks er nul-baserede positioner blandt data-occurrences, inklusive skjulte occurrences

Layout-resolveren måler hver occurrence separat, komprimerer overlevende lodrette offsets og reserverer det komplette gentagne udstrækning, før følgende indhold placeres; fast højde, indholdsafledt højde og tabelrækker deltager i reflow

Stabil identitet og persistens

Widget-ID'er kombinerer opake skabelon- og datasets-identiteter og forbliver stabile, når foregående rækker skjules eller fjernes, efter gemning og genindlæsning, og mens overlevende felter beholder fokus eller ventende redigeringer

Helperen gemmer namespace-kvalificerede identitetsattributter og instance-overrides i en fremmed-namespace-udvidelse inde i formularpakken med urn:hotpdf:xfa:instance-presentation:1; nyligt tilføjede rækker modtager friske identiteter og skabelonstandarder, og fjernede rækker kan ikke overføre ventende redigeringer til erstatningsrækker

SaveToBytes returnerer den komplette XDP inklusive opdaterede datasets, identiteter og præsentationstilstande; brug THotPDF.SetXFADocument til at persistere den i en PDF og sæt XFANeedsRendering := True ved skrivning af en dynamisk formular

Efter PDF-genindlæsning: hent den komplette XDP med THotPDF.CreateLoadedXFAWidgetRuntime.SaveToBytes og konstruér derefter TXFAInstancePresentation ud fra de bytes for at gendanne denne profil

Namespace-udvidelsen fortolkes af denne helper; native HPDFXFAFlatten, default loaded runtime-fabrikken og eksterne XFA-viewers anvender ikke automatisk dens per-instance overrides, så vedvarende lagring af profilen hævder ikke identisk rendering i andre readers

Eksplicit binding og instance-operationer

Gentagne subforms kan binde til en anderledes navngivet dataset-gruppe med <bind match="dataRef" ref="$record.lines.entry[*]"/>; absolutte $record- og $data-rødder samt relative stier understøtter uindekserede parent-grupper og en endelig gentaget gruppe

Felter inde i hver occurrence bruger den native bundet-værdi-resolver, inklusive eksplicitte relative feltbindinger som ref="label"

AddInstance og RemoveInstance opdaterer den valgte datagruppe, håndhæver occur minimum og maksimum, anvender oprettelsesgrænser og omflyder inden publicering; den nye række modtager feltværdier fra skabelonen i stedet for at kopiere indtastede værdier fra den forrige række

Selektorer bruger et unikt skabelonnavn med et valgfrit occurrence-indeks som row[1]; duplikerede skabelonnavne, manglende grupper, ugyldige indeks og mutationer under en tvetydig gentaget parent afviser transaktionen

SetAccess understøtter open, readOnly, protected og nonInteractive; instance-begrænsninger nedarves af efterkommere og forhindrer redigering gennem den eede runtime

Betingede events

DispatchConditionalEvent lokaliserer et matchende felt-event med JavaScript-indholdstype og parser den afgrænsede profil direkte; Execute afvikler et eksplicit script mod et eksisterende widget-ID

if(this.rawValue=="hide"){
  row[1].presence="hidden";
}else{
  row[1].presence="visible";
}
row.instanceManager.addInstance();
row.instanceManager.removeInstance(0);

Betingelser accepterer lighed eller ulighed mellem this.rawValue og en uescaped quoted literal; nestede klamrede if- og valgfri else-blokke er afgrænsede af MaxDepth

Tildelinger understøtter presence og access; alle grene er syntakstjekkede, inklusive grene der ikke tages, og ikke-understøttede operationer afviser hele batchen

this.rawValue læser den committede widgetværdi; commit ventende redigeringer gennem Runtime.CommitEdit, før et event dispatches, der bør iagttage dem

Den originale Runtime.DispatchEvent beholder sin begrænsede literal-operation-adfærd og afviser betinget og indekseret instance-syntaks; denne helper leverer ikke en generel JavaScript- eller FormCalc-fortolker, browser-API'er, netværksadgang eller automatisk XFA lifecycle-dispatch

Transaktioner og budgetter

Mutationer afvikles gennem TXFAWidgetRuntime.UpdateDocument sammen med native beregninger og afgrænset stabil reflow; fejl gendanner serialiseret XDP, fokus, ventende redigeringer, valideringstilstand, beregnings- og reflow-tællere samt advarselsantal

Fokus-, layout- og widget-invaliderings-callbacks publiceres først efter succes; rollback-opløsning undertrykker opbrugt helper-arbejde og cancellation-tjek, mens nativer layout og widget-beggrundskanter beholder, så cancellation ikke kan forhindre genopretning

Initialisér TXFAPresentationOptions med Default; standarderne er 200.000 operationer, 4.096 præsentationstilstande, 10.000 oprettede instances pr. gruppe, 32 MiB input- og dokumentkonvolut, 65.536 script-bytes, 32 betingede nesting-niveauer og 5.000 millisekunder

MaxInputBytes begrænser også en konservativ escaped XML-konvolut inden for hvert layout- og publiceringsgennemløb, inklusive identitetsattributter, namespace-erklæringer, tekst og datasets-ændringer; gyldig XML kan nå denne konservative grænse, før dets serialiserede byteantal når samme værdi

Cancelled er en valgfri objektmetode-callback tjekket under afgrænset arbejde; de indlejrede Runtime-options fortsætter med at begrænse widgets, værdier, beregninger, layout, reflow og native script-arbejde

Host-maling og tilgængelighed

Accessibility returnerer synlige widget-records med stabil ID, rolle, caption eller feltnavn, tooltip-beskrivelse, committed værdi, side og beggrundskanter, fokus, gyldighed, skrivebeskyttet og krævet tilstand samt choice-labels; passwordværdier udelades

PaintPage leverer et snapshot af synlige widgets og tilsvarende tilgængelighedsrecords til en TXFAHostWidgetPainter; custom hosts kan implementere egne kontroller eller renderingsflade

TXFACanvasWidgetPainter leverer faktisk VCL- og LCL-canvas-maling af widget-kanter, tekst, password-masking, checkbox- og radiomærker, choice-indikatorer, buttons og fokus med positiv skala og valgfrie offsets; den clipper hver widget og gendanner canvas-styles

Canvas-adapteren maler widgets og maler ikke det fulde statiske XFA-grafiktræ; hosten leverer egen sidebaggrund, statisk grafik, event-routing, markeringspræsentation og tilgængelighedsbro til sin platform

Runtime og helper er single-thread objekter; callbacks skal følge hostens trådejerskab og undgå rekursive mutationer under en aktiv transaktion

C++Builder-kaldere skal levere alle canvas painter konstruktørargumenter som new TXFACanvasWidgetPainter(canvas, 1, 0, 0); de genererede headers beholder ikke disse flydende-komma default-argumenter

Verificering

Accept dækker 106 Delphi-tilfælde pr. arkitektur, frisk FPC-kompilering på begge Windows-arkitekturer, C++Builder public-header-kompilering på Win32 og Win64x samt uafhængig validering af det faktiske PDF/XDP-output

Tests/Fixtures/XFAInstancePresentation/explicit-invoice.xdp indeholder uafhængige datanavne, tre gentagne fakturalinjer, et betinget event, metadata til tilgængelighed og en efterfølgende footer

Den uafhængige verify_saved_invoice.py læser den genererede PDF med pypdf og tjekker rigtige XDP data-rækker, unikke persistente identiteter, skjult occurrence-tilstand, initialiserede standarder og genindlæsningsidentiteter

Run-XFAInstancePresentationTests.ps1 afvikler helper-tjekkene og eksisterende XFA event-, runtime-, scripting-, SOM-, DOM- og opløsningsregressionsfixtures uden GUI eller eksterne PDF-readers

powershell -File Tests/Delphi/Run-XFAInstancePresentationTests.ps1 -Platform Win32 -CheckCppHeaders
powershell -File Tests/Delphi/Run-XFAInstancePresentationTests.ps1 -Platform Win64 -CheckCppHeaders
python Tests/Fixtures/XFAInstancePresentation/verify_saved_invoice.py

Se Interactive XFA Widget Runtime for den kompatible base-runtime og native redigeringskontrakt