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
| Create | Tạ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 |
| Reset | Xó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 |
| FocusField | Xá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 |
| GetFieldPageRect | Trả 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 |
| HitTest | Trả 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 |
| GetTabSequence | Trả 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 |
| FocusAt | Kiể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 |
| FocusNext | Tiế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 |
| Blur | Xá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 |
| BeginEdit | Tậ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ó |
| SetEditValue | Cậ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 |
| SetSelection | Giớ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 |
| SetSelectionRange | Giớ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 |
| GetSelectionRange | Trả 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 |
| SetTextDirection | Chọ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 |
| GetVisualCaretOrder | Trả 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 |
| MoveVisualCaret | Di 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 |
| GetSelectedText | Trả về văn bản UTF-16 đang được chọn hoặc chuỗi rỗng |
| ReplaceSelection | Thay 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 |
| CutSelection | Trả về và xóa văn bản được chọn qua cùng đường dẫn thay thế nguyên tử |
| PasteText | Thay 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 |
| CanUndoEdit | Bá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 |
| CanRedoEdit | Bá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ó |
| RedoEdit | Phá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ó |
| ClearEditHistory | Bỏ 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 |
| DispatchInputEvent | Gử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ả |
| CommitEdit | Kiể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 |
| CancelEdit | Bỏ 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
| LibraryInstance | Thực thể TPDFlib hiện tại không sở hữu |
|---|---|
| FocusedFieldIndex | Chỉ 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 |
| EditingFieldIndex | Trườ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 |
| OriginalValue | Giá trị trường được BeginEdit ghi lại |
| EditValue | Giá trị tạm thời hiện tại |
| DisplayValue | Giá 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 |
| SelectionStart | Chỉ số bắt đầu UTF-16 tính từ 0 |
| SelectionLength | Độ dài vùng chọn UTF-16 |
| SelectionAnchor | Vị 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 |
| SelectionCaret | Mép di động UTF-16 tính từ 0 của vùng chọn có hướng |
| TextDirection | Hướng đã cấu hình, mặc định ftdAuto và được giữ qua các phiên chỉnh sửa trong phiên |
| ResolvedTextDirection | Hướ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 |
| VisualCaretPosition | Vị 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í |
| MaxUndoSteps | Số 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 |
| UndoEditCount | Số mục được giữ hiện có cho UndoEdit |
| RedoEditCount | Số mục được giữ hiện có cho RedoEdit |
| Modified | True khi EditValue khác OriginalValue |
| HoveredFieldIndex | Widget có trạng thái pointer-enter đang hoạt động, hoặc 0 |
| PressedFieldIndex | Widget 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
| OnAction | Nhậ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ờ |
|---|---|
| OnFocusChanged | Bá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 |
| OnValueChanged | Bá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 |
| OnTextEdit | Nhậ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