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

CreateCria uma sessão anexada a uma instância da biblioteca propriedade do chamador
AttachLibraryRepõe todo o estado transitório e anexa outra instância da biblioteca propriedade do chamador, ou nil
ResetLimpa o estado de foco, edição e seleção sem alterar valores de campos nem expedir ações
FocusFieldConfirma ou cancela a edição atual, expede /Bl para o Widget anterior e depois expede /Fo para o Widget visível pedido
GetFieldPageRectDevolve um retângulo de Widget visível em coordenadas visuais rodadas do CropBox sem alterar a página selecionada
HitTestDevolve 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
GetTabSequenceDevolve 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
FocusAtTesta 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
FocusNextMove 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
BlurConfirma ou cancela a edição atual e expede /Bl antes de limpar o foco
BeginEditPõe em foco um campo de texto ou de escolha editável e captura o respetivo valor original
SetEditValueAtualiza 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
SetSelectionLimita e guarda um intervalo de seleção UTF-16 com base zero dentro do valor transitório
SetSelectionRangeLimita 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
GetSelectionRangeDevolve âncora, cursor, início e comprimento normalizados na unidade de índice pedida, juntamente com a direção original
SetTextDirectionSeleciona 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
GetVisualCaretOrderDevolve í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
MoveVisualCaretMove 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
GetSelectedTextDevolve o texto UTF-16 atualmente selecionado ou uma cadeia vazia
ReplaceSelectionSubstitui 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
CutSelectionDevolve e remove o texto selecionado pelo mesmo caminho de substituição atómica
PasteTextSubstitui 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
CanUndoEditReporta se a edição ativa tem uma entrada do histórico que possa ser invertida
CanRedoEditReporta se a edição ativa tem uma entrada invertida do histórico que possa ser aplicada de novo
UndoEditInverte a última edição retida e restaura a respetiva seleção direcionada anterior
RedoEditRepõe a próxima edição retida e restaura a respetiva seleção direcionada resultante
ClearEditHistoryDescarta o histórico de desfazer e refazer da edição ativa sem alterar o respetivo valor ou seleção atuais
DispatchInputEventExpede 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
CommitEditValida e formata um candidato antes de guardar o respetivo valor bruto, atualiza a aparência formatada e depois aciona OnValueChanged
CancelEditDescarta o valor transitório e a seleção sem alterar o campo

Propriedades de estado

LibraryInstanceInstância TPDFlib atual, sem propriedade
FocusedFieldIndexÍndice do campo ou Widget temporário em foco, ou zero quando nenhum Widget tem o foco
EditingFieldIndexCampo de base de texto ou escolha a ser editado, ou zero quando não há edição ativa
OriginalValueValor do campo capturado por BeginEdit
EditValueValor transitório atual
DisplayValueValor 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
SelectionLengthComprimento da seleção UTF-16
SelectionAnchorPosição UTF-16 da âncora com base zero, que permanece fixa enquanto o cursor estende uma seleção direcionada
SelectionCaretExtremidade móvel UTF-16, com base zero, da seleção direcionada
TextDirectionDireção configurada, ftdAuto por predefinição, mantida entre edições na sessão
ResolvedTextDirectionDireção explícita ou a direção automática selecionada a partir do primeiro caráter forte do valor da edição ativa
VisualCaretPositionRanhura atual na ordem física do cursor em cache, ou -1 quando nenhum movimento visual selecionou uma ranhura
MaxUndoStepsMáximo de entradas do histórico de edição retidas, de 0 a 10000; a predefinição é 1000 e zero desativa o registo
UndoEditCountNúmero de entradas retidas atualmente disponíveis para UndoEdit
RedoEditCountNúmero de entradas retidas atualmente disponíveis para RedoEdit
ModifiedTrue quando EditValue difere de OriginalValue
HoveredFieldIndexWidget com estado de entrada do ponteiro atualmente ativo, ou zero
PressedFieldIndexWidget que mantém a captura do ponteiro primário até ao largar correspondente ou ao cancelamento do ponteiro, ou zero

Eventos

OnActionRecebe 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
OnFocusChangedReporta cada transição de foco concluída, incluindo transições para zero após uma nova ação de foco ser vetada
OnValueChangedReporta uma alteração de valor confirmada com êxito depois de o campo e as respetivas aparências alteradas serem atualizados
OnTextEditRecebe 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