Dynamic XFA Instance Presentation

Birim: HPDFXFAPresentation

TXFAInstancePresentation, bağımsız bir TXFAWidgetRuntime'a sahiptir ve tek datasets record'lu XDP packet belgeleri için sınırlı bir instance presentation profili ekler

Bir occurrence'ı akıştan çıkarmak için SetPresence('row[1]', 'hidden'), widget'larını gizlerken alanını korumak için invisible ve onu geri yüklemek için visible kullanın; indeksler, gizlenmiş occurrence'lar dâhil data occurrence'ları arasındaki zero-based konumlardır

Layout resolver, her occurrence'ı ayrı ölçer, hayatta-kalan dikey offset'leri sıkıştırır ve sonraki içeriği yerleştirmeden önce eksiksiz tekrar-kapsamı reserve eder; sabit-yükseklikli, içerikten-türetilmiş yükseklikli ve table satırları reflow'a katılır

Kararlı identity ve persistence

Widget ID'leri, opak template ve datasets identity'lerini birleştirir ve önceki satırlar gizlendiğinde veya kaldırıldığında, save ve reload sonrasında ve hayatta-kalan field'lar focus veya bekleyen edit tutarken kararlı kalır

Helper, yabancı-namespace bir uzantı içinde form packet'ine namespace-qualified identity attribute'ları ve instance override'ları saklar — urn:hotpdf:xfa:instance-presentation:1 kullanarak; yeni eklenen satırlar taze identity'ler ve template default'ları alır ve kaldırılan satırlar, bekleyen edit'leri replacement satırlara devretemez

SaveToBytes, eksiksiz XDP'yi döndürür — güncellenmiş datasets, identity'ler ve presentation state'leri dâhil; onu bir PDF'te kalıcılaştırmak için THotPDF.SetXFADocument kullanın ve dinamik bir form yazarken XFANeedsRendering := True ayarlayın

PDF reload'dan sonra, eksiksiz XDP'yi THotPDF.CreateLoadedXFAWidgetRuntime.SaveToBytes ile alın, ardından bu profili geri yüklemek için o baytlardan TXFAInstancePresentation kurun

Namespace uzantısı bu helper tarafından yorumlanır; native HPDFXFAFlatten, default loaded runtime fabrikası ve harici XFA viewer'lar instance-başına override'larını otomatik uygulamaz — bu yüzden profili kalıcı saklamak, diğer reader'larda özdeş rendering iddia etmez

Açık binding ve instance operation'ları

Tekrar-subform'lar, <bind match="dataRef" ref="$record.lines.entry[*]"/> ile farklı adlandırılmış bir dataset grubuna bağlanabilir; mutlak $record ve $data root'ları ve göreli path'ler, indekslenmemiş parent grupları ve son bir tekrar-grubu destekler

Her occurrence içindeki field'lar, ref="label" gibi açık göreli field binding'leri dâhil, native bound-value resolver'ı kullanır

AddInstance ve RemoveInstance, seçili data grubunu günceller, occur minimum ve maksimumunu uygular, oluşturma limitlerini uygular ve yayımdan önce reflow eder; yeni satır, önceki satırdan girilen value'ları kopyalamak yerine field value'larını template'ten alır

Selector'lar, opsiyonel occurrence indeksli eşsiz bir template adı kullanır — row[1] gibi; duplicate template adları, eksik gruplar, geçersiz indeksler ve belirsiz bir tekrar-parent altındaki mutation'lar transaction'ı reddeder

SetAccess, open, readOnly, protected ve nonInteractive destekler; instance kısıtları descendant'lara kalıtılır ve owned runtime üzerinden editing'i önler

Koşullu event'ler

DispatchConditionalEvent, JavaScript content türüyle eşleşen bir field event'ini konumlandırır ve sınırlı profili doğrudan parse eder; Execute, mevcut bir widget ID'sine karşı açık bir script çalıştırır

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

Koşullar, this.rawValue ile escape edilmemiş quote'lanmış bir literal arasındaki eşitliği veya eşitsizliği kabul eder; iç-ice braced if ve opsiyonel else block'ları MaxDepth ile sınırlanır

Atamalar, presence ve access destekler; alınmayan dallar dâhil tüm dallar syntax check'lidir ve desteklenmeyen operation'lar tüm batch'i reddeder

this.rawValue, commit edilmiş widget value'sunu okur; onları gözlemlemesi gereken bir event'i dispatch etmeden önce Runtime.CommitEdit ile bekleyen edit'leri commit edin

Orijinal Runtime.DispatchEvent, kısıtlı literal-operation davranışını tutar ve koşullu ve indeksli-instance sözdizimini reddeder; bu helper, genel bir JavaScript veya FormCalc yorumlayıcısı, browser API'leri, ağ erişimi veya otomatik XFA lifecycle dispatch sağlamaz

Transaction'lar ve bütçeler

Mutation'lar, TXFAWidgetRuntime.UpdateDocument üzerinden — native calculation'lar ve sınırlı kararlı reflow ile birlikte — yürütülür; başarısızlık, serialize edilmiş XDP'yi, focus'u, bekleyen edit'leri, validation state'ini, calculation ve reflow sayaçlarını ve uyarı sayısını geri alır

Focus, layout ve widget invalidation callback'leri yalnızca başarılı olduktan sonra yayımlanır; rollback resolution, native layout'u ve widget sınırlarını tutarken tükenmiş helper işini ve cancellation check'lerini bastırır — böylece cancellation restoration'ı engelleyemez

TXFAPresentationOptions'ı Default ile başlatın; default'lar, 200.000 operation, 4.096 presentation state, grup başına 10.000 oluşturulmuş instance, 32 MiB input ve belge zarfı, 65.536 script baytı, 32 koşullu nesting düzeyi ve 5.000 milisaniyedir

MaxInputBytes, her layout ve yayım geçişinden önce muhafazakâr bir escaped XML zarfını da sınırlar — identity attribute'ları, namespace bildirimleri, metin ve datasets değişiklikleri dâhil; geçerli XML, serialize edilmiş bayt sayısı aynı value'ya ulaşmadan önce bu muhafazakâr limite ulaşabilir

Cancelled, sınırlı iş sırasında denetlenen opsiyonel bir object-method callback'idir; gömülü Runtime option'ları, widget'ları, value'ları, calculation'ları, layout'u, reflow'u ve native script işini sınırlamaya devam eder

Host painting ve erişilebilirlik

Accessibility, kararlı ID, role, caption veya field adı, tooltip açıklaması, commit edilmiş value, sayfa ve sınırlar, focus, geçerlilik, read-only ve required state'leri ve choice label'larıyla görünür widget kayıtları döndürür; password value'ları atlanır

PaintPage, görünür widget'ların snapshot'ını ve karşılık gelen erişilebilirlik kayıtlarını bir TXFAHostWidgetPainter'a teslim eder; özel host'lar kendi kontrollerini veya rendering yüzeyini uygulayabilir

TXFACanvasWidgetPainter, widget border'ları, metin, password maskeleme, checkbox ve radio işaretleri, choice göstergeleri, button'lar ve focus için gerçek VCL ve LCL canvas painting sağlar — pozitif ölçek ve opsiyonel offset'lerle; her widget'ı kırpar ve canvas style'larını geri yükler

Canvas adapter'ı widget'ıları boyar ve tam statik XFA grafik ağaçını boyamaz; host, kendi sayfa arka planını, statik grafiklerini, event routing'ini, seçim presentation'ını ve erişilebilirlik köprüsünü kendi platformuna sağlar

Runtime ve helper tek-thread object'lerdir; callback'ler, host'un thread ownership'ini izlemeli ve aktif bir transaction sırasında özyinelemeli mutation'lardan kaçınmalıdır

C++Builder çağıranları, tüm canvas painter constructor argümanlarını sağlamalıdır — new TXFACanvasWidgetPainter(canvas, 1, 0, 0) gibi; üretilmiş header'lar bu floating-point default argümanları tutmaz

Doğrulama

Kabul, architektür başına 106 Delphi case'ini, her iki Windows architektüründe taze FPC compilation'ı, Win32 ve Win64x'te C++Builder public-header compilation'ı ve gerçek PDF/XDP output'unun bağımsız doğrulamasını kapsar

Tests/Fixtures/XFAInstancePresentation/explicit-invoice.xdp, bağımsız data adları, üç tekrar-fatura satırı, bir koşullu event, erişilebilirlik için metadata ve bir sonraki footer içerir

Run-XFAInstancePresentationTests.ps1, helper check'lerini ve mevcut XFA event, runtime, scripting, SOM, DOM ve resolution regresyon fixture'larını GUI veya harici PDF reader'lar olmadan çalıştırır

Bağımsız verify_saved_invoice.py, üretilmiş PDF'i pypdf ile okur ve gerçek XDP data satırlarını, eşsiz kalıcı identity'leri, hidden occurrence state'ini, başlatılmış default'ları ve reload identity'lerini denetler

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

Uyumlu temel runtime ve native editing sözleşmesi için bkz. Interactive XFA Widget Runtime