TPDFlibFormSession
Formulários, interação, tipos de dados
Descrição
Mantém o teste de incidência AcroForm, a navegação por teclado, o foco, o valor de edição e o estado de seleção de texto sem depender de um framework GUI A instância
TPDFlib
/Fo/BlOnAction
/KOnTextEdit/MaxLen
DispatchInputEvent
/E anexada permanece propriedade do chamador e tem de sobreviver à sessão
As transições de foco expõem as ações de Widget /X e /D como callbacks tipadas do anfitrião através de /U
Os retângulos de página usam o CropBox visual após a rotação da página, nas unidades de medição atuais da biblioteca, com a origem no canto superior esquerdo visual
As seleções direcionadas retêm posições independentes de âncora e cursor e podem ser definidas ou consultadas em unidades de código UTF-16, pontos de código Unicode ou aglomerados de grafemas extensos
As edições bidirecionais retêm a ordem lógica do valor do campo, resolvendo as ranhuras visuais do cursor por linha a partir dos níveis de incorporação, pelo que o movimento físico para a esquerda e para a direita segue texto misto da esquerda para a direita e da direita para a esquerda
As substituições de seleção expedem
/V ao anfitrião, expõem o texto selecionado e o de substituição através de /F, impõem
DisplayValue em fronteiras de grafemas completas e colapsam a seleção após uma edição aceite
Cada edição ativa mantém um histórico de deltas delimitado que restaura o valor transitório, o valor de apresentação e a seleção direcionada sem reexpedir ações de formulário nem callbacks de edição do anfitrião
Declaraçã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;
Métodos
| Create | Cria uma sessão anexada a uma instância da biblioteca propriedade do chamador |
|---|---|
| AttachLibrary | Repõe todo o estado transitório e anexa outra instância da biblioteca propriedade do chamador, ou nil |
| Reset | Limpa o estado de foco, edição e seleção sem alterar valores de campos nem expedir ações |
| FocusField | Confirma ou cancela a edição atual, expede /Bl para o Widget anterior e depois expede /Fo para o Widget visível pedido |
| GetFieldPageRect | Devolve um retângulo de Widget visível em coordenadas visuais rodadas do CropBox sem alterar a página selecionada |
| HitTest | Devolve o Widget visível mais alto num ponto visual da página, usando as entradas posteriores da matriz /Annots da página como a incidência mais à frente |
| GetTabSequence | Devolve os Widgets visíveis entre páginas pela ordem das páginas e aplica a semântica de /Tabs /R, /C, /S, PDF 2.0 /A e /W, a rotação da página e ViewerPreferences /Direction; um valor /Tabs em falta ou inválido usa a ordem da matriz de anotações |
| FocusAt | Testa a incidência num ponto visual da página e põe em foco o Widget devolvido pelo caminho normal de ações de confirmação, perda de foco e foco |
| FocusNext | Move para a frente ou para trás pela sequência de tabulação calculada, com contorno opcional e as regras normais de transição de foco |
| Blur | Confirma ou cancela a edição atual e expede /Bl antes de limpar o foco |
| BeginEdit | Põe em foco um campo de texto ou de escolha editável e captura o respetivo valor original |
| SetEditValue | Atualiza o valor transitório e impõe o comprimento máximo configurado de um campo de texto sem dividir um aglomerado de grafemas extensível |
| SetSelection | Limita e guarda um intervalo de seleção UTF-16 com base zero dentro do valor transitório |
| SetSelectionRange | Limita as posições direcionadas de âncora e cursor na unidade de índice pedida, converte-as para o intervalo UTF-16 interno e nunca divide um ponto de código ou aglomerado de grafemas quando qualquer unidade Unicode é usada |
| GetSelectionRange | Devolve âncora, cursor, início e comprimento normalizados na unidade de índice pedida, juntamente com a direção original |
| SetTextDirection | Seleciona a direção de parágrafo automática, da esquerda para a direita explícita ou da direita para a esquerda explícita, e invalida a ordem visual do cursor em cache |
| GetVisualCaretOrder | Devolve índices lógicos do cursor seguros para grafemas pela ordem física da esquerda para a direita, incluindo ranhuras divididas distintas em fronteiras de direção mista |
| MoveVisualCaret | Move ou estende a seleção direcionada uma ranhura visual física e colapsa as seleções existentes em direção ao extremo físico pedido |
| GetSelectedText | Devolve o texto UTF-16 atualmente selecionado ou uma cadeia vazia |
| ReplaceSelection | Substitui a seleção normalizada através de uma única transação vetável /K e OnTextEdit, e depois colapsa o cursor após a substituição aceite |
| CutSelection | Devolve e remove o texto selecionado pelo mesmo caminho de substituição atómica |
| PasteText | Substitui a seleção atual por texto da área de transferência fornecido pelo chamador, sem introduzir dependência da área de transferência da plataforma |
| CanUndoEdit | Reporta se a edição ativa tem uma entrada do histórico que possa ser invertida |
| CanRedoEdit | Reporta se a edição ativa tem uma entrada invertida do histórico que possa ser aplicada de novo |
| UndoEdit | Inverte a última edição retida e restaura a respetiva seleção direcionada anterior |
| RedoEdit | Repõe a próxima edição retida e restaura a respetiva seleção direcionada resultante |
| ClearEditHistory | Descarta o histórico de desfazer e refazer da edição ativa sem alterar o respetivo valor ou seleção atuais |
| DispatchInputEvent | Expede um evento de ponteiro, roda, tecla ou texto composto neutro da plataforma e devolve o estado resultante de foco, sobrevoo, pressão, valor e seleção |
| CommitEdit | Valida e formata um candidato antes de guardar o respetivo valor bruto, atualiza a aparência formatada e depois aciona OnValueChanged |
| CancelEdit | Descarta o valor transitório e a seleção sem alterar o campo |
Propriedades de estado
| LibraryInstance | Instância TPDFlib atual, sem propriedade |
|---|---|
| FocusedFieldIndex | Índice do campo ou Widget temporário em foco, ou zero quando nenhum Widget tem o foco |
| EditingFieldIndex | Campo de base de texto ou escolha a ser editado, ou zero quando não há edição ativa |
| OriginalValue | Valor do campo capturado por BeginEdit |
| EditValue | Valor transitório atual |
| DisplayValue | Valor de edição atual ou o valor de apresentação formatado produzido pela última confirmação bem-sucedida |
| SelectionStart | Índice inicial UTF-16 com base zero |
| SelectionLength | Comprimento da seleção UTF-16 |
| SelectionAnchor | Posição UTF-16 da âncora com base zero, que permanece fixa enquanto o cursor estende uma seleção direcionada |
| SelectionCaret | Extremidade móvel UTF-16, com base zero, da seleção direcionada |
| TextDirection | Direção configurada, ftdAuto por predefinição, mantida entre edições na sessão |
| ResolvedTextDirection | Direção explícita ou a direção automática selecionada a partir do primeiro caráter forte do valor da edição ativa |
| VisualCaretPosition | Ranhura atual na ordem física do cursor em cache, ou -1 quando nenhum movimento visual selecionou uma ranhura |
| MaxUndoSteps | Máximo de entradas do histórico de edição retidas, de 0 a 10000; a predefinição é 1000 e zero desativa o registo |
| UndoEditCount | Número de entradas retidas atualmente disponíveis para UndoEdit |
| RedoEditCount | Número de entradas retidas atualmente disponíveis para RedoEdit |
| Modified | True quando EditValue difere de OriginalValue |
| HoveredFieldIndex | Widget com estado de entrada do ponteiro atualmente ativo, ou zero |
| PressedFieldIndex | Widget que mantém a captura do ponteiro primário até ao largar correspondente ou ao cancelamento do ponteiro, ou zero |
Eventos
| OnAction | Recebe um TPDFlibActionInfo tipado para as ações disponíveis de foco, perda de foco, tecla, validação e formatação; coloque Allow em False para vetar a operação pendente |
|---|---|
| OnFocusChanged | Reporta cada transição de foco concluída, incluindo transições para zero após uma nova ação de foco ser vetada |
| OnValueChanged | Reporta uma alteração de valor confirmada com êxito depois de o campo e as respetivas aparências alteradas serem atualizados |
| OnTextEdit | Recebe o tipo de edição, a seleção UTF-16, o texto selecionado e a substituição mutável antes de o valor transitório mudar; coloque Allow em False para uma recusa atómica |
Valor devolvido
As funções que alteram o estado devolvem 1 em caso de êxito e 0 quando o pedido é inválido, reentrante, vetado ou não pode ser confirmado; HitTest devolve um índice de campo ou de Widget temporário, e GetTabSequence devolve o número de entradas
Unidades de seleção
fsuUTF16CodeUnit preserva o contrato legado de indexação WideString com base zero, incluindo posições dentro de um par substituto quando explicitamente pedido
fsuUnicodeCodePoint conta um par substituto válido como um ponto de código suplementar e trata um substituto não emparelhado como um ponto de código isolado
fsuGraphemeCluster conta aglomerados de grafemas extensos completos, para que sequências combináveis e emojis unidos permaneçam indivisíveis
As tabelas de fronteiras Unicode são postas em cache para o valor de edição atual e invalidadas quando esse valor muda
Navegação bidirecional
ftdAuto usa o primeiro caráter forte e assume da esquerda para a direita quando a edição não tem nenhum caráter direcional forte
A ordem visual dos segmentos é resolvida independentemente para cada linha e não altera o valor lógico UTF-16 do campo, a cadeia PDF nem o alinhamento do texto
Um índice lógico pode ocupar duas ranhuras visuais distintas numa fronteira de direção mista, pelo que
VisualCaretPosition desambigua o movimento repetido através dessa fronteira
Exemplo
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;
Consulte também
SetTextDirection, GetVisualCaretOrder, MoveVisualCaret, TPDFlibFormTextDirection, DispatchInputEvent, TPDFlibFormInputEvent, TPDFlibFormInputResult, UndoEdit, RedoEdit, ClearEditHistory, ReplaceSelection, CutSelection, PasteText, TPDFlibFormEditKind, SetSelectionRange, GetSelectionRange, ExecuteFormFieldScript, TPDFlibActionInfo