TPDFlibFormSession

Formlar, etkileşim, veri türleri

Açıklama

Bir GUI çerçevesine dayanmadan AcroForm isabet testini, klavye gezinmesini, odağı, düzenleme değerini ve metin seçim durumunu sürdürür

Bağlı TPDFlib örneği çağıranın mülkiyetinde kalır ve oturumdan uzun yaşamak zorundadır

Odak geçişleri widget /Fo ve /Bl eylemlerini, türlendirilmiş ana makine geri çağrımları olarak OnAction üzerinden açığa çıkarır

Sayfa dikdörtgenleri sayfa döndürmesinden sonraki görsel CropBox'ı, kitaplığın geçerli ölçü birimleriyle kullanır; başlangıç noktası görsel sol üst köşededir

Yönlü seçimler bağımsız çapa ve imleç konumlarını saklar ve UTF-16 kod birimleri, Unicode kod noktaları veya genişletilmiş grafem kümeleriyle ayarlanabilir ya da sorgulanabilir

İki yönlü düzenlemeler mantıksal alan değeri sırasını korurken gömme düzeylerinden satır başına görsel imleç yuvalarını çözer; böylece fiziksel Sol ve Sağ hareketi, soldan sağa ile sağdan sola karışık metni izler

Seçim değiştirmeleri /K'yı ana makineye gönderir, seçilen ve ikame metni OnTextEdit üzerinden açığa çıkarır, tam grafem sınırlarında /MaxLen'i uygular ve kabul edilen bir düzenlemeden sonra seçimi daraltır

Her etkin düzenleme, form eylemlerini veya ana makine düzenleme geri çağrımlarını yeniden göndermeden geçici değeri, görüntülenen değeri ve yönlü seçimi onaran sınırlı bir fark geçmişi tutar

DispatchInputEvent; platformdan bağımsız işaretçi, tekerlek, adlandırılmış tuş ve birleştirilmiş metin kayıtlarını kısıtlı widget eylemlerine, odak geçişlerine, grafem güvenli düzenlemeye, düğme etkinleştirmeye ve seçim alanı gezinmesine dönüştürür

Oturum girilen ve basılı widget kimliğini saklar; böylece /E, /X, /D ve /U, işaretçi yakalama ve iptali aşsa bile PDF tetikleyici sıralamasını izler

İşlemeler /V ve /F eylemlerini gönderir, belgeyi değiştirmeden önce desteklenen sınırlı JavaScript alt kümesini yürütür ve doğrulama, biçimlendirme veya bir ana makine geri çağrımı işlemi reddettiğinde etkin düzenlemeyi tutar

Doğrulanmış ham değer alana saklanırken DisplayValue ile üretilen widget görünümü biçimlendirme sonucunu korur

Bildirim

type
  TPDFlibFormFieldIndices = array of Integer;

  TPDFlibFormSelectionUnit = (fsuUTF16CodeUnit,
    fsuUnicodeCodePoint, fsuGraphemeCluster);

  TPDFlibFormTextDirection = (ftdAuto,
    ftdLeftToRight, ftdRightToLeft);
  TPDFlibFormCaretIndices = array of Integer;

  TPDFlibFormSelection = record
    IndexUnit: TPDFlibFormSelectionUnit;
    AnchorIndex: Integer;
    CaretIndex: Integer;
    StartIndex: Integer;
    SelectionLength: Integer;
    IsReversed: Boolean;
  end;

  TPDFlibFormSessionActionEvent = procedure(Sender: TObject;
    FieldIndex: Integer; const TriggerEvent: AnsiString;
    const ActionInfo: TPDFlibActionInfo; var Allow: Boolean) of object;
  TPDFlibFormSessionFocusEvent = procedure(Sender: TObject;
    OldFieldIndex, NewFieldIndex: Integer) of object;
  TPDFlibFormSessionValueEvent = procedure(Sender: TObject;
    FieldIndex: Integer; const OldValue, NewValue: WideString) of object;
  TPDFlibFormEditKind = (fekReplaceSelection,
    fekCutSelection, fekPasteText);
  TPDFlibFormSessionTextEditEvent = procedure(Sender: TObject;
    FieldIndex: Integer; EditKind: TPDFlibFormEditKind;
    SelectionStart, SelectionLength: Integer;
    const SelectedText: WideString; var ReplacementText: WideString;
    var Allow: Boolean) of object;

  TPDFlibFormInputEventKind = (fiekPointerMove,
    fiekPointerDown, fiekPointerUp, fiekPointerDoubleClick,
    fiekPointerLeave, fiekPointerCancel, fiekWheel,
    fiekKeyDown, fiekKeyUp, fiekTextInput);
  TPDFlibFormInputModifiers = set of TPDFlibFormInputModifier;

  TPDFlibFormInputEvent = record
    Kind: TPDFlibFormInputEventKind;
    Modifiers: TPDFlibFormInputModifiers;
    Button: TPDFlibFormInputButton;
    Key: TPDFlibFormInputKey;
    Page: Integer;
    X, Y: Double;
    WheelDeltaX, WheelDeltaY: Double;
    Text: WideString;
  end;

  TPDFlibFormSession = class
  public
    constructor Create(ALibrary: TPDFlib);
    procedure AttachLibrary(ALibrary: TPDFlib);
    procedure Reset;
    function FocusField(FieldIndex: Integer;
      CommitCurrent: Boolean = True): Integer;
    function GetFieldPageRect(FieldIndex: Integer; out Page: Integer;
      out Left, Top, Width, Height: Double): Integer;
    function HitTest(Page: Integer; X, Y: Double): Integer;
    function GetTabSequence(out FieldIndices: TPDFlibFormFieldIndices): Integer;
    function FocusAt(Page: Integer; X, Y: Double;
      CommitCurrent: Boolean = True): Integer;
    function FocusNext(Backwards: Boolean = False;
      WrapAround: Boolean = True; CommitCurrent: Boolean = True): Integer;
    function Blur(CommitCurrent: Boolean = True): Integer;
    function BeginEdit(FieldIndex: Integer): Integer;
    function SetEditValue(const NewValue: WideString): Integer;
    function SetSelection(StartIndex, SelectionLength: Integer): Integer;
    function SetSelectionRange(AnchorIndex, CaretIndex: Integer;
      IndexUnit: TPDFlibFormSelectionUnit): Integer;
    function GetSelectionRange(IndexUnit: TPDFlibFormSelectionUnit;
      out Selection: TPDFlibFormSelection): Integer;
    function SetTextDirection(
      Direction: TPDFlibFormTextDirection): Integer;
    function GetVisualCaretOrder(IndexUnit: TPDFlibFormSelectionUnit;
      out CaretIndices: TPDFlibFormCaretIndices): Integer;
    function MoveVisualCaret(ToRight: Boolean;
      ExtendSelection: Boolean = False): Integer;
    function GetSelectedText: WideString;
    function ReplaceSelection(const ReplacementText: WideString): Integer;
    function CutSelection(out CutText: WideString): Integer;
    function PasteText(const Text: WideString): Integer;
    function CanUndoEdit: Boolean;
    function CanRedoEdit: Boolean;
    function UndoEdit: Integer;
    function RedoEdit: Integer;
    procedure ClearEditHistory;
    function DispatchInputEvent(
      const InputEvent: TPDFlibFormInputEvent;
      out InputResult: TPDFlibFormInputResult): Integer;
    function CommitEdit: Integer;
    procedure CancelEdit;
    property TextDirection: TPDFlibFormTextDirection;
    property ResolvedTextDirection: TPDFlibFormTextDirection;
    property VisualCaretPosition: Integer;
    property MaxUndoSteps: Integer;
    property UndoEditCount: Integer;
    property RedoEditCount: Integer;
    property HoveredFieldIndex: Integer;
    property PressedFieldIndex: Integer;
  end;

Yöntemler

CreateArayanın sahibi olduğu bir kitaplık örneğine eklenen bir oturum oluşturur
AttachLibraryTüm geçici durumu sıfırlar ve arayanın sahibi olduğu başka bir kitaplık örneğini veya nil ekler
ResetAlan değerlerini değiştirmeden ve eylem dağıtmadan odak, düzenleme ve seçim durumunu temizler
FocusFieldGeçerli düzenlemeyi kesinleştirir veya iptal eder, önceki Widget için /Bl dağıtır ve sonra istenen görünür Widget için /Fo dağıtır
GetFieldPageRectSeçili sayfayı değiştirmeden döndürülmüş görsel CropBox koordinatlarında bir görünür Widget dikdörtgeni döndürür
HitTestGörsel bir sayfa noktasındaki en üstteki görünür Widget'ı döndürür; sayfa /Annots dizisindeki sonraki girdileri en öndeki isabet olarak kullanır
GetTabSequenceSayfa sırasıyla sayfalar arası görünür Widget'ları döndürür ve /Tabs /R, /C, /S, PDF 2.0 /A ve /W anlambilimini, sayfa döndürmesini ve ViewerPreferences /Direction değerini uygular; eksik veya geçersiz bir /Tabs değeri ek açıklama dizisi sırasını kullanır
FocusAtGörsel bir sayfa noktasını isabet testinden geçirir ve döndürülen Widget'ı normal kesinleştirme, odak kaybı ve odak eylemi yoluyla odaklar
FocusNextHesaplanan sekme dizisi boyunca isteğe bağlı sarmalama ve normal odak geçişi kurallarıyla ileri veya geri hareket eder
BlurGeçerli düzenlemeyi kesinleştirir veya iptal eder ve odağı temizlemeden önce /Bl dağıtır
BeginEditDüzenlenebilir bir metin veya seçim alanına odaklanır ve özgün değerinin anlık görüntüsünü alır
SetEditValueGeçici değeri günceller ve bir genişletilmiş grafem kümesini bölmeden metin alanının yapılandırılmış en fazla uzunluğunu zorlar
SetSelectionGeçici değer içinde 0 tabanlı bir UTF-16 seçim aralığını sınırlandırıp saklar
SetSelectionRangeİstenen dizin biriminde yönlü çapa ve imleç konumlarını sınırlandırır, bunları iç UTF-16 aralığına dönüştürür ve herhangi bir Unicode birimi kullanıldığında asla bir kod noktası veya grafem kümesi bölmez
GetSelectionRangeİstenen dizin biriminde çapayı, imleci, normalleştirilmiş başlangıcı ve uzunluğu özgün yönle birlikte döndürür
SetTextDirectionOtomatik, açık soldan sağa veya açık sağdan sola paragraf yönünü seçer ve önbelleğe alınmış görsel imleç sırasını geçersizleştirir
GetVisualCaretOrderKarışık yön sınırlarındaki ayrı bölünmüş yuvalar dahil, grafem güvenli mantıksal imleç dizinlerini fiziksel soldan sağa sırada döndürür
MoveVisualCaretYönlü seçimi bir fiziksel görsel yuva kadar hareket ettirir veya genişletir ve mevcut seçimleri istenen fiziksel kenara doğru daraltır
GetSelectedTextŞu anda seçili UTF-16 metnini veya boş dizeyi döndürür
ReplaceSelectionNormalleştirilmiş seçimi tek bir veto edilebilir /K ve OnTextEdit işlemi üzerinden değiştirir, sonra kabul edilen değiştirmeden sonra imleci daraltır
CutSelectionSeçili metni aynı atomik değiştirme yoluyla döndürür ve kaldırır
PasteTextGeçerli seçimi, platform panosu bağımlılığı oluşturmadan arayanın sağladığı pano metniyle değiştirir
CanUndoEditEtkin düzenlemede tersine çevrilebilecek bir geçmiş girdisi olup olmadığını bildirir
CanRedoEditEtkin düzenlemede yeniden oynatılabilecek tersine çevrilmiş bir geçmiş girdisi olup olmadığını bildirir
UndoEditSaklanan son düzenlemeyi tersine çevirir ve önceki yönlü seçimini geri yükler
RedoEditSaklanan bir sonraki düzenlemeyi yeniden oynatır ve sonuçlanan yönlü seçimini geri yükler
ClearEditHistoryEtkin düzenlemenin geri alma ve yineleme geçmişini geçerli değerini veya seçimini değiştirmeden atar
DispatchInputEventTek bir platformdan yansız işaretçi, tekerlek, tuş veya bileşik metin olayını dağıtır ve sonuçlanan odak, üzerine gelme, basma, değer ve seçim durumunu döndürür
CommitEditHam değerini saklamadan önce adayı doğrular ve biçimlendirir, biçimlendirilmiş görünümü tazeler ve sonra OnValueChanged tetikler
CancelEditAlanı değiştirmeden geçici değeri ve seçimi atar

Durum özellikleri

LibraryInstanceGeçerli, sahipsiz TPDFlib örneği
FocusedFieldIndexOdaklanan alan veya geçici Widget dizini; hiçbir Widget odaklı değilken sıfır
EditingFieldIndexDüzenlenen temel metin veya seçim alanı; düzenleme etkin değilken sıfır
OriginalValueBeginEdit tarafından yakalanan alan değeri
EditValueGeçerli geçici değer
DisplayValueGeçerli düzenleme değeri veya son başarılı kesinleştirmenin ürettiği biçimlendirilmiş görüntü değeri
SelectionStart0 tabanlı UTF-16 başlangıç dizini
SelectionLengthUTF-16 seçim uzunluğu
SelectionAnchorİmleç yönlü bir seçim genişletirken sabit kalan 0 tabanlı UTF-16 çapa konumu
SelectionCaretYönlü seçimin 0 tabanlı UTF-16 hareketli kenarı
TextDirectionYapılandırılmış yön; varsayılanı ftdAuto ve oturumdaki düzenlemeler boyunca korunur
ResolvedTextDirectionAçık yön veya etkin düzenleme değerinin ilk güçlü karakterinden seçilen otomatik yön
VisualCaretPositionÖnbelleğe alınmış fiziksel imleç sırasındaki geçerli yuva; hiçbir görsel hareket yuva seçmemişse -1
MaxUndoSteps0 ile 10000 arası saklanan en fazla düzenleme geçmişi girdisi; varsayılan 1000'dir ve sıfır kaydı devre dışı bırakır
UndoEditCountŞu anda UndoEdit için kullanılabilir saklanan girdi sayısı
RedoEditCountŞu anda RedoEdit için kullanılabilir saklanan girdi sayısı
ModifiedTrue; EditValue değeri OriginalValue değerinden farklı olduğunda doğrudur
HoveredFieldIndexŞu anda etkin işaretçi giriş durumunda olan Widget veya sıfır
PressedFieldIndexEşleşen bırakmaya veya işaretçi iptaline kadar birincil işaretçi yakalamasını koruyan Widget veya sıfır

Olaylar

OnActionKullanılabilir odak, odak kaybı, tuş vuruşu, doğrulama ve biçimlendirme eylemleri için tipli bir TPDFlibActionInfo alır; bekleyen işlemi veto etmek için Allow değerini False yapın
OnFocusChangedYeni bir odak eylemi veto edildikten sonraki sıfıra geçişler dahil her tamamlanmış odak geçişini bildirir
OnValueChangedAlan ve kirli görünümleri güncellendikten sonra başarıyla kesinleştirilmiş bir değer değişikliğini bildirir
OnTextEditGeçici değer değişmeden önce düzenleme türünü, UTF-16 seçimi, seçili metni ve değiştirilebilir yerine koymayı alır; atomik reddetme için Allow değerini False yapın

Dönüş değeri

Durum değiştiren işlevler başarıda 1 döndürür ve istek geçersiz, yeniden girişli, veto edilmiş veya kesinleştirilemediğinde 0 döndürür; HitTest bir alan veya geçici Widget dizinini, GetTabSequence ise girdi sayısını döndürür

Seçim birimleri

fsuUTF16CodeUnit eski sıfır tabanlı WideString indeksleme sözleşmesini korur; açıkça istendiğinde bir vekil çiftin içindeki konumlar dahil

fsuUnicodeCodePoint geçerli bir vekil çifti tek yardımcı kod noktası sayar ve eşsiz bir vekili bağımsız tek bir kod noktası sayar

fsuGraphemeCluster eksiksiz genişletilmiş grafem kümelerini sayar; böylece birleştirici diziler ve bitişik emoji bölünmez kalır

Unicode sınır tabloları geçerli düzenleme değeri için önbelleğe alınır ve o değer değiştiğinde geçersiz kılınır

Çift yönlü gezinme

ftdAuto ilk güçlü karakteri kullanır ve düzenlemede güçlü yönlü karakter yoksa varsayılan olarak soldan sağayı seçer

Görsel dizi sırası her satır için bağımsız çözülür ve mantıksal UTF-16 alan değerini, PDF dizisini veya metin hizalamasını değiştirmez

Karışık yön sınırında bir mantıksal indeks iki ayrı görsel yuvayı kaplayabilir; böylece VisualCaretPosition o sınır üzerinden tekrarlanan hareketi ayırt eder

Örnek

var
  Session: TPDFlibFormSession;
  Selection: TPDFlibFormSelection;
begin
  Session := TPDFlibFormSession.Create(PDF);
  try
    if Session.FocusAt(PageNumber, MouseX, MouseY) = 1 then
      Session.FocusNext(False, True);
    if Session.BeginEdit(Session.FocusedFieldIndex) = 1 then
    begin
      Session.SetEditValue('A' + WideChar($D83D) + WideChar($DE00) + 'B');
      Session.SetSelectionRange(1, 2, fsuUnicodeCodePoint);
      Session.GetSelectionRange(fsuUTF16CodeUnit, Selection);
      Session.SetTextDirection(ftdAuto);
      Session.MoveVisualCaret(True, True);
      Session.PasteText('replacement');
      if Session.CanUndoEdit then
        Session.UndoEdit;
      if Session.CanRedoEdit then
        Session.RedoEdit;
      Session.CommitEdit;
    end;
  finally
    Session.Free;
  end;
end;

Ayrıca bkz.

SetTextDirection, GetVisualCaretOrder, MoveVisualCaret, TPDFlibFormTextDirection, DispatchInputEvent, TPDFlibFormInputEvent, TPDFlibFormInputResult, UndoEdit, RedoEdit, ClearEditHistory, ReplaceSelection, CutSelection, PasteText, TPDFlibFormEditKind, SetSelectionRange, GetSelectionRange, ExecuteFormFieldScript, TPDFlibActionInfo