Dynamic XFA instance presentation
Unit: HPDFXFAPresentation
TXFAInstancePresentation is eigenaar van een onafhankelijke TXFAWidgetRuntime en voegt een begrensd instance-presentation-profiel toe voor XDP packet-documenten met één datasets-record
Gebruik SetPresence('row[1]', 'hidden') om één voorkoming uit de flow te halen, invisible om diens ruimte te houden terwijl de widgets verborgen blijven, en visible om alles terug te zetten; indices zijn zero-based posities tussen de data-voorkomingen, verborgen voorkomingen inbegrepen
De layout resolver meet elke voorkoming apart, compact overlevende verticale offsets en reserveert de complete herhaalde omvang voordat volgende content wordt geplaatst; vaste hoogte, content-afgeleide hoogte en tabelrijen doen mee aan de reflow
Stabiele identiteit en persistentie
Widget-ID's combineren ondoorzichtige template- en datasets-identiteiten en blijven stabiel wanneer voorgaande rijen verborgen of verwijderd worden, na save en reload, en terwijl overlevende velden focus of pending edits houden
De helper bewaart namespace-gekwalificeerde identiteitsattributen en instance-overrides in een extensie met foreign namespace binnen de form packet, via urn:hotpdf:xfa:instance-presentation:1; nieuw toegevoegde rijen krijgen verse identiteiten en template-defaults, en verwijderde rijen kunnen hun pending edits niet overdragen aan vervangende rijen
SaveToBytes geeft de complete XDP terug, inclusief bijgewerkte datasets, identiteiten en presentation states; gebruik THotPDF.SetXFADocument om die in een PDF te bewaren en zet XFANeedsRendering := True bij het wegschrijven van een dynamisch formulier
Na een PDF-reload haal je de complete XDP op met THotPDF.CreateLoadedXFAWidgetRuntime.SaveToBytes en construeer je TXFAInstancePresentation opnieuw uit die bytes om dit profiel te herstellen
De namespace-extensie wordt door deze helper geïnterpreteerd; native HPDFXFAFlatten, de standaard loaded-runtime-factory en externe XFA-viewers passen de per-instance-overrides niet automatisch toe, dus het persistent bewaren van het profiel garandeert geen identieke rendering in andere readers
Expliciete binding en instance-operaties
Herhaalde subforms kunnen binden aan een anders genaamde dataset-groep met <bind match="dataRef" ref="$record.lines.entry[*]"/>; absolute $record- en $data-wortels en relatieve paths ondersteunen niet-geïndexeerde oudergroepen en een finale herhaalde groep
Velden binnen elke voorkoming gebruiken de native bound-value resolver, inclusief expliciete relatieve veldbindingen zoals ref="label"
AddInstance en RemoveInstance werken de geselecteerde datagroep bij, handhaven het occur-minimum en -maximum, passen creation limits toe en doen een reflow vóór publicatie; de nieuwe rij krijgt veldwaarden uit de template in plaats van ingevoerde waarden uit de vorige rij te kopiëren
Selectors gebruiken een unieke templaatnaam met een optionele occurrence-index, zoals row[1]; dubbele templaatnamen, ontbrekende groepen, ongeldige indices en mutaties onder een ambigu herhaald ouderejecteren de transactie
SetAccess ondersteunt open, readOnly, protected en nonInteractive; instance-beperkingen worden geërfd door afstammelingen en blokkeren bewerken via de owned runtime
Conditionele events
DispatchConditionalEvent zoekt een matchend veldevent met JavaScript content type en parseert het begrensde profiel direct; Execute draait een expliciet script tegen een bestaande widget-ID
if(this.rawValue=="hide"){
row[1].presence="hidden";
}else{
row[1].presence="visible";
}
row.instanceManager.addInstance();
row.instanceManager.removeInstance(0);
Condities accepteren gelijkheid of ongelijkheid tussen this.rawValue en een niet-geëscapet geqoutet literal; geneste if-blokken met braces en een optioneel else-blok worden begrensd door MaxDepth
Assignments ondersteunen presence en access; alle branches worden syntax gecontroleerd, ook branches die niet worden genomen, en niet-ondersteunde operaties verwerpen de hele batch
this.rawValue leest de committe widgetwaarde; commit pending edits via Runtime.CommitEdit voordat je een event dispatcht dat ze zou moeten observeren
De oorspronkelijke Runtime.DispatchEvent houdt diens beperkte literal-operation-gedrag en verwerpt conditionele en geïndexeerde instance-syntax; deze helper levert geen algemene JavaScript- of FormCalc-interpreter, geen browser-API's, geen netwerktoegang en geen automatische XFA-lifecycle-dispatch
Transacties en budgetten
Mutaties lopen via TXFAWidgetRuntime.UpdateDocument, samen met native berekeningen en begrensde stabiele reflow; falen herstelt geserialiseerde XDP, focus, pending edits, validatiestatus, calculation- en reflow-counters en het aantal warnings
Focus-, layout- en widget-invalidation-callbacks publiceren pas na succes; rollback resolution onderdrukt uitgeput helperwerk en annuleringschecks terwijl native layout en widget-bounds behouden blijven, zodat annulering herstel niet kan verhinderen
Initialiseer TXFAPresentationOptions met Default; defaults zijn 200.000 operations, 4.096 presentation states, 10.000 aangemaakte instances per groep, 32 MiB invoer- en documentenvelop, 65.536 scriptbytes, 32 conditionele nesting-niveaus en 5.000 milliseconden
MaxInputBytes begrenst ook een conservatieve geëscapete XML-envelop vóór elke layout- en publicatiepass, inclusief identiteitsattributen, namespace-declaraties, tekst en datasets-wijzigingen; geldige XML kan deze conservatieve grens raken voordat diens geserialiseerde byte-aantal dezelfde waarde bereikt
Cancelled is een optionele object-method callback die tijdens begrensd werk wordt gecheckt; de embedded Runtime-options blijven widgets, waarden, berekeningen, layout, reflow en native scriptwerk begrenzen
Host painting en toegankelijkheid
Accessibility geeft zichtbare widget-records terug met stabiele ID, role, caption of veldnaam, tooltip-omschrijving, committe waarde, pagina en bounds, focus, geldigheid, read-only- en required-statussen en choice-labels; wachtwoordwaarden worden weggelaten
PaintPage levert een snapshot van zichtbare widgets en bijbehorende accessibility-records aan een TXFAHostWidgetPainter; custom hosts kunnen hun eigen controls of renderingsurface implementeren
TXFACanvasWidgetPainter levert echte VCL- en LCL-canvas painting voor widget-randen, tekst, password-masking, checkbox- en radio-markeringen, choice-indicatoren, buttons en focus, met positieve schaal en optionele offsets; hij clipst elke widget en herstelt de canvas-styles
De canvas-adapter pint widgets en niet de volledige statische XFA-grafische boom; de host levert zelf de pagina-achtergrond, statische graphics, event routing, selectiepresentatie en accessibility-bridge naar diens platform
De runtime en de helper zijn single-thread objecten; callbacks moeten de thread-eigendomsregels van de host volgen en recursieve mutaties tijdens een actieve transactie vermijden
C++Builder-aanroepers moeten alle constructor-argumenten van de canvas painter meegeven, zoals new TXFACanvasWidgetPainter(canvas, 1, 0, 0); de gegenereerde headers bewaren deze floating-point default-argumenten niet
Verificatie
Acceptatie dekt 106 Delphi-cases per architectuur, verse FPC-compilatie op beide Windows-architecturen, C++Builder public-header-compilatie op Win32 en Win64x, en onafhankelijke validatie van de echte PDF/XDP-uitvoer
Tests/Fixtures/XFAInstancePresentation/explicit-invoice.xdp bevat onafhankelijke datanamen, drie herhaalde factuurregels, een conditioneel event, metadata voor toegankelijkheid en een volgende footer
Run-XFAInstancePresentationTests.ps1 draait de helper-checks en bestaande XFA event-, runtime-, scripting-, SOM-, DOM- en resolution-regressiefixtures zonder GUI of externe PDF-readers
De onafhankelijke verify_saved_invoice.py leest de gegenereerde PDF met pypdf en checkt echte XDP-datarijen, unieke persistente identiteiten, verborgen occurrence-status, geïnitialiseerde defaults en reload-identiteiten
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
Zie Interactive XFA widget runtime voor de compatibele basis-runtime en het native editing-contract