Presentazione delle istanze XFA dinamiche

Unit: HPDFXFAPresentation

TXFAInstancePresentation possiede un TXFAWidgetRuntime indipendente e aggiunge un profilo di presentazione per istanza limitato ai documenti pacchetto XDP con un record datasets

Usate SetPresence('row[1]', 'hidden') per togliere una occorrenza dal flusso, invisible per conservarne lo spazio nascondendo i widget, e visible per ripristinarla; gli indici sono posizioni zero-based tra le occorrenze dei dati, incluse le occorrenze nascoste

Il resolver di layout misura ogni occorrenza separatamente, compatta gli offset verticali superstiti e riserva l'intera estensione ripetuta prima di posizionare il contenuto successivo; righe a altezza fissa, ad altezza derivata dal contenuto e di tabella partecipano al reflow

Identità stabile e persistenza

Gli ID dei widget combinano identità opache di template e datasets e restano stabili quando righe precedenti vengono nascoste o rimosse, dopo salvataggio e reload, e mentre i campi superstiti conservano il focus o modifiche in sospeso

L'helper memorizza attributi di identità qualificati per namespace e override per istanza in un'estensione di namespace estraneo dentro il pacchetto form, usando urn:hotpdf:xfa:instance-presentation:1; le righe appena aggiunte ricevono identità fresche e default del template, e le righe rimosse non possono trasferire modifiche in sospeso alle righe di rimpiazzo

SaveToBytes restituisce l'XDP completo, inclusi datasets aggiornati, identità e stati di presentazione; usate THotPDF.SetXFADocument per persistere in un PDF e impostate XFANeedsRendering := True quando scrivete un form dinamico

Dopo il reload del PDF, ottenete l'XDP completo con THotPDF.CreateLoadedXFAWidgetRuntime.SaveToBytes, poi costruite TXFAInstancePresentation da quei byte per ripristinare questo profilo

L'estensione di namespace è interpretata da questo helper; l' HPDFXFAFlatten nativo, la factory di runtime caricato default e i viewer XFA esterni non applicano automaticamente i suoi override per istanza, quindi persistere il profilo non afferma un rendering identico in altri reader

Binding esplicito e operazioni per istanza

I subform ripetuti possono essere vincolati a un gruppo dataset con nome diverso tramite <bind match="dataRef" ref="$record.lines.entry[*]"/>; le radici assolute $record e $data e i percorsi relativi supportano gruppi padri non indicizzati e un gruppo ripetuto finale

I campi dentro ogni occorrenza usano il resolver nativo dei valori vincolati, inclusi binding relativi espliciti dei campi come ref="label"

AddInstance e RemoveInstance aggiornano il gruppo dati selezionato, fanno rispettare il minimo e il massimo occur, applicano limiti di creazione e fanno reflow prima della pubblicazione; la riga nuova riceve i valori dei campi dal template invece di copiare i valori inseriti dalla riga precedente

I selettori usano un nome template univoco con indice di occorrenza opzionale, come row[1]; nomi template duplicati, gruppi mancanti, indici non validi e mutazioni sotto un padre ripetuto ambiguo rifiutano la transazione

SetAccess supporta open, readOnly, protected e nonInteractive; le restrizioni per istanza vengono ereditate dai discendenti e impediscono l'editing attraverso il runtime posseduto

Eventi condizionali

DispatchConditionalEvent individua un evento campo corrispondente con content type JavaScript e analizza direttamente il profilo limitato; Execute esegue uno script esplicito contro un ID widget esistente

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

Le condizioni accettano uguaglianza o disuguaglianza tra this.rawValue e un literal tra virgolette non escapato; i blocchi if annidati tra graffe e i blocchi else opzionali sono limitati da MaxDepth

Gli assegnamenti supportano presence e access; tutti i rami vengono verificati sintatticamente, inclusi i rami non percorsi, e le operazioni non supportate rifiutano l'intero batch

this.rawValue legge il valore committato del widget; committate le modifiche in sospeso con Runtime.CommitEdit prima di dispatchare un evento che dovrebbe osservarle

Il Runtime.DispatchEvent originale conserva il proprio comportamento ristretto a operazioni su literal e rifiuta la sintassi condizionale e per istanze indicizzate; questo helper non fornisce un interprete JavaScript o FormCalc generale, API browser, accesso di rete o dispatch automatico del ciclo di vita XFA

Transazioni e budget

Le mutazioni si eseguono tramite TXFAWidgetRuntime.UpdateDocument, insieme ai calcoli nativi e a un reflow stabile limitato; il fallimento ripristina XDP serializzato, focus, modifiche in sospeso, stato di validazione, contatori di calcolo e reflow e conteggio warning

I callback di focus, layout e invalidazione widget pubblicano solo dopo il successo; la risoluzione di rollback sopprime il lavoro esaurito dell'helper e i controlli di cancellazione mantenendo layout nativo e bounds dei widget, così la cancellazione non può impedire il ripristino

Inizializzate TXFAPresentationOptions con Default; i default sono 200.000 operazioni, 4.096 stati di presentazione, 10.000 istanze create per gruppo, envelope input e documento di 32 MiB, 65.536 byte di script, 32 livelli di nesting condizionale e 5.000 millisecondi

MaxInputBytes limita anche un envelope XML escapato conservativo prima di ogni passata di layout e pubblicazione, inclusi attributi di identità, dichiarazioni di namespace, testo e modifiche ai datasets; un XML valido può raggiungere questo limite conservativo prima che il proprio conteggio di byte serializzati raggiunga lo stesso valore

Cancelled è un callback object-method opzionale controllato durante il lavoro limitato; le opzioni del Runtime incorporato continuano a limitare widget, valori, calcoli, layout, reflow e lavoro script nativo

Painting dell'host e accessibilità

Accessibility restituisce record widget visibili con ID stabile, ruolo, caption o nome campo, descrizione tooltip, valore committato, pagina e bounds, focus, validità, stati read-only e required, ed etichette choice; i valori password vengono omessi

PaintPage consegna uno snapshot dei widget visibili e i corrispondenti record di accessibilità a un TXFAHostWidgetPainter; host custom possono implementare i propri controlli o superfici di rendering

TXFACanvasWidgetPainter fornisce painting reale su canvas VCL e LCL per bordi, testo, mascheramento password, segni checkbox e radio, indicatori choice, bottoni e focus dei widget, con scala positiva e offset opzionali; clippa ogni widget e ripristina gli stili del canvas

L'adattatore canvas dipinge i widget e non dipinge l'intero albero grafico statico XFA; l'host fornisce il proprio sfondo pagina, grafica statica, routing degli eventi, presentazione della selezione e bridge di accessibilità verso la propria piattaforma

Runtime e helper sono oggetti single-thread; i callback devono rispettare l'ownership dei thread dell'host ed evitare mutazioni ricorsive durante una transazione attiva

I chiamanti C++Builder devono fornire tutti gli argomenti del costruttore del canvas painter, come new TXFACanvasWidgetPainter(canvas, 1, 0, 0); gli header generati non conservano questi argomenti default in virgola mobile

Verifica

L'accettazione copre 106 casi Delphi per architettura, compilazione FPC fresca su entrambe le architetture Windows, compilazione degli header pubblici C++Builder su Win32 e Win64x e validazione indipendente dell'output PDF/XDP reale

Tests/Fixtures/XFAInstancePresentation/explicit-invoice.xdp contiene nomi dati indipendenti, tre righe fattura ripetute, un evento condizionale, metadati per l'accessibilità e un footer successivo

Run-XFAInstancePresentationTests.ps1 esegue i controlli dell'helper e i fixture di regressione esistenti su eventi, runtime, scripting, SOM, DOM e risoluzione XFA senza GUI né lettori PDF esterni

Il verificatore indipendente verify_saved_invoice.py legge il PDF generato con pypdf e controlla righe dati XDP reali, identità persistenti univoche, stato delle occorrenze nascoste, default inizializzati e identità dopo il reload

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

Vedere Interactive XFA Widget Runtime per il runtime base compatibile e il contratto di editing nativo