Dynamisk XFA-instanspresentation
Enhet: HPDFXFAPresentation
TXFAInstancePresentation äger en fristående TXFAWidgetRuntime och lägger till en avgränsad instanspresentationsprofil för XDP-paketdokument med en datasets-post
Använd SetPresence('row[1]', 'hidden') för att ta bort en förekomst från flödet, invisible för att behålla dess utrymme medan dess widgets döljs, och visible för att återställa den; index är nollbaserade positioner bland dataförekomsterna, inklusive dolda förekomster
Layoutlösaren mäter varje förekomst separat, komprimerar kvarvarande vertikala offset och reserverar hela det upprepade utsträcket innan efterföljande innehåll placeras; rader med fast höjd, innehållshärledd höjd och tabellrader deltar i reflow
Stabil identitet och persistens
Widget-ID:n kombinerar opaka template- och datasets-identiteter och förblir stabila när föregående rader döljs eller tas bort, efter sparning och omläsning, och medan överlevande fält behåller fokus eller väntande redigeringar
Hjälpfunktionen lagrar namnrymdskvalificerade identitetsattribut och instansåsidosättningar i en utökning med främmande namnrymd inuti formulärpaketet, med urn:hotpdf:xfa:instance-presentation:1; nyligen tillagda rader får färska identiteter och template-standardvärden, och borttagna rader kan inte överföra väntande redigeringar till ersättningsrader
SaveToBytes returnerar hela XDP:n, inklusive uppdaterade datasets, identiteter och presentationstillstånd; använd THotPDF.SetXFADocument för att bevara den i en PDF och sätt XFANeedsRendering := True när du skriver ett dynamiskt formulär
Efter PDF-omläsning, hämta hela XDP:n med THotPDF.CreateLoadedXFAWidgetRuntime.SaveToBytes och konstruera sedan TXFAInstancePresentation från de byten för att återställa profilen
Namnrymdsutökningen tolkas av denna hjälpfunktion; native HPDFXFAFlatten, standardfabriken för laddad runtime och externa XFA-visare tillämpar inte automatiskt dess instansvisa åsidosättningar, så att lagra profilen beständigt hävdar inte identisk rendering i andra läsare
Explicit bindning och instansoperationer
Upprepade subforms kan binda till en annorlunda namngiven datasetgrupp med <bind match="dataRef" ref="$record.lines.entry[*]"/>; absoluta $record- och $data-rötter och relativa sökvägar stöder oindexerade föräldragrupper och en avslutande upprepad grupp
Fält inuti varje förekomst använder den native uppslagaren för bundna värden, inklusive explicita relativa fältbindningar som ref="label"
AddInstance och RemoveInstance uppdaterar den valda datagruppen, tvingar occur-minimum och -maximum, tillämpar skapandegränser och gör reflow före publiceringen; den nya raden får fältvärden från templaten i stället för att kopiera inmatade värden från föregående rad
Selektorer använder ett unikt templatenamn med ett valfritt förekomstindex, som row[1]; duplicerade templatenamn, saknade grupper, ogiltiga index och muteringar under en tvetydig upprepad förälder avvisar transaktionen
SetAccess stöder open, readOnly, protected och nonInteractive; instansbegränsningar ärvs av efterkommande och förhindrar redigering via den egna runtime:n
Villkorade events
DispatchConditionalEvent hittar ett matchande fältevent med JavaScript-innehållstyp och tolkar den avgränsade profilen direkt; Execute kör ett explicit skript mot ett befintligt widget-ID
if(this.rawValue=="hide"){
row[1].presence="hidden";
}else{
row[1].presence="visible";
}
row.instanceManager.addInstance();
row.instanceManager.removeInstance(0);
Villkor accepterar likhet eller olikhet mellan this.rawValue och en oescapad citerad literal; nästlade klammeromslutna if och valfria else-block begränsas av MaxDepth
Tilldelningar stöder presence och access; alla grenar syntaxkontrolleras, inklusive grenar som inte tas, och operationer som inte stöds avvisar hela batchen
this.rawValue läser det genomförda widgetvärdet; genomför väntande redigeringar via Runtime.CommitEdit innan du skickar ett event som ska iaktta dem
Det ursprungliga Runtime.DispatchEvent behåller sitt begränsade literaloperationsbeteende och avvisar villkors- och indexerad instanssyntax; denna hjälpfunktion tillhandahåller ingen allmän JavaScript- eller FormCalc-tolk, inga webbläsar-API:er, ingen nätverksåtkomst och ingen automatisk XFA-livscyclerutskick
Transaktioner och budgeter
Muteringar körs via TXFAWidgetRuntime.UpdateDocument, tillsammans med native beräkningar och avgränsad stabil reflow; fel återställer serialiserad XDP, fokus, väntande redigeringar, valideringstillstånd, beräknings- och reflow-räknare samt varningsantal
Callbacks för fokus, layout och widgetogiltigförklaring publiceras först efter framgång; rollback-lösningen undertrycker uttömt hjälpfunktionsarbete och avbrottskontroller medan native layout och widgetgränser behålls, så att avbrott inte kan hindra återställningen
Initiera TXFAPresentationOptions med Default; standardvärdena är 200 000 operationer, 4 096 presentationstillstånd, 10 000 skapade instanser per grupp, 32 MiB indata- och dokumentkuvert, 65 536 skriptbyte, 32 villkorliga nästlingsnivåer och 5 000 millisekunder
MaxInputBytes begränsar också ett konservativt escapad XML-kuvert före varje layout- och publiceringsomgång, inklusive identitetsattribut, namnrymdsdeklarationer, text och datasets-ändringar; giltig XML kan nå denna konservativa gräns innan dess serialiserade byteantal når samma värde
Cancelled är en valfri objektmetod-callback som kontrolleras under avgränsat arbete; de inbäddade Runtime-alternativen begränsar fortsatt widgets, värden, beräkningar, layout, reflow och native skriptarbete
Ritning i värden och tillgänglighet
Accessibility returnerar synliga widgetposter med stabilt ID, roll, rubrik eller fältnamn, tooltip-beskrivning, genomfört värde, sida och gränser, fokus, giltighet, read-only- och obligatoriskt-tillstånd samt choice-etiketter; lösenordsvärden utelämnas
PaintPage levererar en ögonblicksbild av synliga widgets och motsvarande tillgänglighetsposter till en TXFAHostWidgetPainter; egna värdar kan implementera sina egna kontroller eller renderingsytor
TXFACanvasWidgetPainter tillhandahåller verklig VCL- och LCL-canvasritning av widgetramar, text, lösenordsmaskering, checkbox- och radiomarkeringar, choice-indikatorer, knappar och fokus, med positiv skala och valfria offset; den klipper varje widget och återställer canvasstilar
Canvasadaptorn ritar widgets och ritar inte hela det statiska XFA-grafikträdet; värden tillhandahåller egen sidbakgrund, statisk grafik, event dirigering, urvalspresentation och tillgänglighetsbrygga till sin plattform
Runtime:n och hjälpfunktionen är entrådsobjekt; callbacks måste följa värdens trådägande och undvika rekursiva muteringar under en aktiv transaktion
C++Builder-anropare måste ange alla konstruktionsargument till canvaspaintern, som new TXFACanvasWidgetPainter(canvas, 1, 0, 0); de genererade headerfilerna behåller inte dessa flyttals-standardargument
Verifiering
Acceptansen omfattar 106 Delphi-fall per arkitektur, färsk FPC-kompilering på båda Windows-arkitekturerna, C++Builder-kompilering av publika headers på Win32 och Win64x samt fristående validering av den verkliga PDF/XDP-utdata
Tests/Fixtures/XFAInstancePresentation/explicit-invoice.xdp innehåller oberoende datanamn, tre upprepade fakturarader, ett villkorat event, metadata för tillgänglighet och en efterföljande sidfot
Run-XFAInstancePresentationTests.ps1 kör hjälpfunktionens kontroller och befintliga regressionsfixtures för XFA-event, runtime, skript, SOM, DOM och uppslutning utan GUI eller externa PDF-läsare
Den fristående verify_saved_invoice.py läser den genererade PDF:en med pypdf och kontrollerar verkliga XDP-datarader, unika beständiga identiteter, dolt förekomstläge, initierade standardvärden och omläsningsidentiteter
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 för den kompatibla bas-runtimen och det native redigeringskontraktet