TPDFlibFormSession

Biểu mẫu, tương tác, kiểu dữ liệu

Mô tả

Duy trì kiểm tra trúng AcroForm, điều hướng bàn phím, tiêu điểm, giá trị chỉnh sửa và trạng thái vùng chọn văn bản mà không phụ thuộc một framework GUI Thực thể

TPDFlib

/Fo/BlOnAction

Hình chữ nhật trang dùng CropBox hiển thị sau khi xoay trang, theo đơn vị đo hiện tại của thư viện, gốc tọa độ ở trên trái hiển thị

Vùng chọn có hướng giữ vị trí anchor và caret độc lập, đặt hay truy vấn được theo đơn vị code UTF-16, code point Unicode hoặc extended grapheme cluster

Chỉnh sửa hai chiều giữ thứ tự logic của giá trị trường, đồng thời giải slot hiển thị của caret theo từng dòng từ embedding level, nên di chuyển Left/Right vật lý bám theo văn bản trộn trái-sang-phải và phải-sang-trái

/KOnTextEdit/MaxLen

Mỗi chỉnh sửa đang hoạt động giữ một lịch sử delta có giới hạn để khôi phục giá trị tạm, giá trị hiển thị và vùng chọn có hướng mà không dispatch lại form action hay host edit callback

DispatchInputEvent

/E được gắn vẫn thuộc sở hữu caller và phải tồn tại lâu hơn phiên Các chuyển tiếp tiêu điểm lộ các hành động Widget /X và /D dưới dạng callback host có kiểu qua /U Các hình chữ nhật trang dùng CropBox trực quan sau xoay trang theo đơn vị đo hiện tại của thư viện, với gốc ở góc trên trái trực quan Các vùng chọn có hướng giữ các vị trí điểm neo và con trỏ độc lập và có thể được đặt hay truy vấn theo đơn vị mã UTF-16, điểm mã Unicode hoặc cụm grapheme mở rộng Các chỉnh sửa hai chiều giữ thứ tự logic giá trị trường trong khi suy các vị trí con trỏ trực quan từng dòng từ các cấp nhúng, nên chuyển động Left và Right vật lý đi theo văn bản trái-sang-phải và phải-sang-trái hỗn hợp Các phép thay vùng chọn gửi

/V tới host, lộ văn bản được chọn và thay thế qua /F, thực thi

DisplayValue tại các biên grapheme hoàn chỉnh và thu vùng chọn sau một chỉnh sửa được chấp nhận Mỗi phiên chỉnh sửa đang hoạt động giữ một lịch sử delta có biên khôi phục giá trị tạm thời, giá trị hiển thị và vùng chọn có hướng mà không gửi lại các hành động biểu mẫu hay callback chỉnh sửa của host

Khai báo

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;

Phương thức

CreateTạo một phiên gắn với một thực thể thư viện sở hữu bởi caller
AttachLibraryĐặt lại toàn bộ trạng thái tạm và gắn một thực thể thư viện khác sở hữu bởi caller, hoặc nil
ResetXóa trạng thái tiêu điểm, chỉnh sửa và vùng chọn mà không thay đổi giá trị trường hay gửi hành động
FocusFieldXác nhận hoặc hủy phiên chỉnh sửa hiện tại, gửi /Bl cho Widget trước rồi gửi /Fo cho Widget hiển thị được yêu cầu
GetFieldPageRectTrả về hình chữ nhật Widget hiển thị trong tọa độ CropBox trực quan đã xoay mà không thay trang được chọn
HitTestTrả về Widget hiển thị trên cùng tại một điểm trang trực quan, dùng các mục sau trong mảng /Annots của trang là lần trúng trước nhất
GetTabSequenceTrả về các Widget hiển thị qua các trang theo thứ tự trang và áp dụng ngữ nghĩa /Tabs /R, /C, /S, PDF 2.0 /A và /W, xoay trang và ViewerPreferences /Direction; một giá trị /Tabs thiếu hoặc không hợp lệ dùng thứ tự mảng chú thích
FocusAtKiểm tra trúng một điểm trang trực quan và tập trung Widget trả về qua đường dẫn hành động xác nhận, mất tiêu điểm và tập trung thông thường
FocusNextTiến hoặc lùi qua chuỗi tab đã tính với wraparound tùy chọn và các quy tắc chuyển tiếp tiêu điểm thông thường
BlurXác nhận hoặc hủy phiên chỉnh sửa hiện tại và gửi /Bl trước khi xóa tiêu điểm
BeginEditTập trung một trường văn bản hoặc choice có thể chỉnh sửa và chụp giá trị gốc của nó
SetEditValueCập nhật giá trị tạm thời và thực thi độ dài tối đa đã cấu hình của trường văn bản mà không chia một cụm grapheme mở rộng
SetSelectionGiới hạn và lưu một khoảng vùng chọn UTF-16 tính từ 0 bên trong giá trị tạm thời
SetSelectionRangeGiới hạn điểm neo và con trỏ có hướng theo đơn vị chỉ số được yêu cầu, chuyển chúng thành khoảng UTF-16 nội bộ và không bao giờ chia một điểm mã hay cụm grapheme khi một đơn vị Unicode được dùng
GetSelectionRangeTrả về điểm neo, con trỏ, vị trí bắt đầu và độ dài chuẩn hóa theo đơn vị chỉ số được yêu cầu cùng hướng gốc
SetTextDirectionChọn hướng đoạn tự động, trái-sang-phải tường minh hoặc phải-sang-trái tường minh và làm mất hiệu lực thứ tự con trỏ trực quan đã cache
GetVisualCaretOrderTrả về các chỉ số con trỏ logic an toàn grapheme theo thứ tự trái-sang-phải vật lý, bao gồm các vị trí tách riêng tại biên hỗn hợp chiều
MoveVisualCaretDi chuyển hoặc mở rộng vùng chọn có hướng một vị trí trực quan vật lý và thu các vùng chọn hiện có về phía mép vật lý được yêu cầu
GetSelectedTextTrả về văn bản UTF-16 đang được chọn hoặc chuỗi rỗng
ReplaceSelectionThay vùng chọn chuẩn hóa qua một giao dịch /K và OnTextEdit có thể phủ quyết, rồi thu con trỏ sau khi thay thế được chấp nhận
CutSelectionTrả về và xóa văn bản được chọn qua cùng đường dẫn thay thế nguyên tử
PasteTextThay vùng chọn hiện tại bằng văn bản clipboard do caller cung cấp mà không tạo phụ thuộc clipboard nền tảng
CanUndoEditBáo phiên chỉnh sửa đang hoạt động có mục lịch sử có thể đảo ngược hay không
CanRedoEditBáo phiên chỉnh sửa đang hoạt động có mục lịch sử đã đảo ngược có thể phát lại hay không
UndoEditĐảo ngược chỉnh sửa được giữ gần nhất và khôi phục vùng chọn có hướng trước đó của nó
RedoEditPhát lại chỉnh sửa được giữ tiếp theo và khôi phục vùng chọn có hướng kết quả của nó
ClearEditHistoryBỏ lịch sử hoàn tác và làm lại của phiên chỉnh sửa đang hoạt động mà không thay giá trị hay vùng chọn hiện tại
DispatchInputEventGửi một sự kiện con trỏ, bánh xe, phím hay văn bản tổ hợp trung lập nền tảng và trả về trạng thái tiêu điểm, hover, nhấn, giá trị và vùng chọn kết quả
CommitEditKiểm chứng và định dạng giá trị ứng viên trước khi lưu giá trị thô, làm mới giao diện định dạng rồi kích hoạt OnValueChanged
CancelEditBỏ giá trị tạm thời và vùng chọn mà không thay trường

Thuộc tính trạng thái

LibraryInstanceThực thể TPDFlib hiện tại không sở hữu
FocusedFieldIndexChỉ số trường hoặc Widget tạm được tập trung, hoặc 0 khi không có Widget nào có tiêu điểm
EditingFieldIndexTrường văn bản hoặc choice gốc đang được chỉnh sửa, hoặc 0 khi không có chỉnh sửa nào hoạt động
OriginalValueGiá trị trường được BeginEdit ghi lại
EditValueGiá trị tạm thời hiện tại
DisplayValueGiá trị chỉnh sửa hiện tại hoặc giá trị hiển thị định dạng do lần xác nhận thành công gần nhất tạo ra
SelectionStartChỉ số bắt đầu UTF-16 tính từ 0
SelectionLengthĐộ dài vùng chọn UTF-16
SelectionAnchorVị trí điểm neo UTF-16 tính từ 0 giữ cố định trong khi con trỏ mở rộng vùng chọn có hướng
SelectionCaretMép di động UTF-16 tính từ 0 của vùng chọn có hướng
TextDirectionHướng đã cấu hình, mặc định ftdAuto và được giữ qua các phiên chỉnh sửa trong phiên
ResolvedTextDirectionHướng tường minh hoặc hướng tự động được chọn từ ký tự mạnh đầu tiên của giá trị chỉnh sửa đang hoạt động
VisualCaretPositionVị trí hiện tại trong thứ tự con trỏ vật lý đã cache, hoặc -1 khi không có lần di chuyển trực quan nào chọn vị trí
MaxUndoStepsSố mục lịch sử chỉnh sửa được giữ tối đa từ 0 đến 10000; mặc định là 1000 và 0 tắt ghi
UndoEditCountSố mục được giữ hiện có cho UndoEdit
RedoEditCountSố mục được giữ hiện có cho RedoEdit
ModifiedTrue khi EditValue khác OriginalValue
HoveredFieldIndexWidget có trạng thái pointer-enter đang hoạt động, hoặc 0
PressedFieldIndexWidget giữ bắt con trỏ chính cho đến lần nhả hoặc hủy con trỏ tương ứng, hoặc 0

Sự kiện

OnActionNhận một TPDFlibActionInfo có kiểu cho các hành động tập trung, mất tiêu điểm, nhấn phím, kiểm chứng và định dạng khả dụng; đặt Allow thành False để phủ quyết thao tác đang chờ
OnFocusChangedBáo từng chuyển tiếp tiêu điểm đã hoàn tất, bao gồm chuyển tiếp về 0 sau khi một hành động tập trung mới bị phủ quyết
OnValueChangedBáo một thay đổi giá trị được xác nhận thành công sau khi trường và các hình thức dirty của nó đã được cập nhật
OnTextEditNhận loại chỉnh sửa, vùng chọn UTF-16, văn bản được chọn và phần thay thế có thể sửa trước khi giá trị tạm thời thay đổi; đặt Allow thành False để từ chối nguyên tử

Giá trị trả về

Các hàm thay đổi trạng thái trả về 1 khi thành công và 0 khi yêu cầu không hợp lệ, tái nhập, bị phủ quyết hoặc không thể xác nhận; HitTest trả về một chỉ số trường hoặc Widget tạm và GetTabSequence trả về số mục

Đơn vị lựa chọn

fsuUTF16CodeUnit giữ hợp đồng chỉ mục WideString tính từ 0 kiểu cũ, bao gồm cả các vị trí bên trong một cặp surrogate khi được yêu cầu tường minh

fsuUnicodeCodePoint đếm một cặp surrogate hợp lệ là một điểm mã bổ sung và coi một surrogate đơn lẻ là một điểm mã độc lập

fsuGraphemeCluster đếm các cụm grapheme mở rộng hoàn chỉnh nên các chuỗi kết hợp và emoji ghép vẫn không thể chia Các bảng biên Unicode được cache cho giá trị chỉnh sửa hiện tại và bị vô hiệu hóa khi giá trị đó thay đổi

Các bảng ranh giới Unicode được cache cho giá trị sửa hiện tại và vô hiệu khi giá trị đổi

Điều hướng hai chiều

ftdAuto dùng ký tự mạnh đầu tiên và mặc định trái-sang-phải khi phiên chỉnh sửa không có ký tự có chiều mạnh nào Thứ tự run trực quan được suy độc lập cho từng dòng và không thay giá trị trường UTF-16 logic, chuỗi PDF hay căn chỉnh văn bản Một chỉ số logic có thể chiếm hai vị trí trực quan riêng tại một biên hỗn hợp chiều, nên

Thứ tự run hiển thị được giải độc lập từng dòng và không đổi giá trị trường UTF-16 logic, PDF string hay căn lề văn bản

VisualCaretPosition phân biệt các lần di chuyển lặp qua biên đó

Ví dụ

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;

Xem thêm

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