TPDFlibFormSession

النماذج، التفاعل، أنواع البيانات

الوصف

تحافظ على اختبار إصابة AcroForm والتنقل بلوحة المفاتيح والتركيز وقيمة التحرير وحالة تحديد النص دون الاعتماد على إطار عمل واجهة رسومية تبقى نسخة

TPDFlib

تكشف انتقالات التركيز إجراءي الأداة /Fo و/Bl بوصفهما ردَّي نداء مضيف موصوفين بالنوع عبر OnAction

تستخدم مستطيلات الصفحة CropBox البصرية بعد دوران الصفحة بوحدات القياس الحالية للمكتبة، والأصل عند أعلى-يسار البصري

التحديدات الموجهة تحتفظ بموضعي المرتساء والمؤشر باستقلال ويمكن ضبطهما أو الاستعلام عنهما بوحدات رموز UTF-16 أو نقاط رموز Unicode أو عناقيد محارف ممتدة

التحرير ثنائي الاتجاه يحتفظ بترتيب قيمة الحقل المنطقي أثناء حسم خانات المؤشر البصرية لكل سطر من مستويات التضمين، فتتبع الحركة الفيزيائية لليمين واليسار النص المختلط من اليسار إلى اليمين ومن اليمين إلى اليسار

ترسل إحلالات التحديد /K إلى المضيف وتكشف النص المحدد والإحلالي عبر OnTextEdit وتفرض /MaxLen عند حدود عناقيد المحارف الكاملة وتنكمش التحديد بعد تحرير مقبول واحد

يحتفظ كل تحرير نشط بسجل فروق محدود يعيد القيمة المؤقتة وقيمة العرض والتحديد الموجه دون إعادة إرسال إجراءات النموذج أو ردود نداء تحرير المضيف

DispatchInputEvent

/E المرفقة مملوكة للمستدعي وعليها أن تطول عمر الجلسة تكشف انتقالات التركيز إجراءات /X و/D لعناصر Widget بوصفها دوال استدعاء موصوفة بالنوع للمضيف عبر /U تستخدم مستطيلات الصفحات الـ CropBox البصرية بعد دوران الصفحة بوحدات القياس الحالية للمكتبة، وبأصل في الزاوية البصرية العلوية اليسرى يحفظ التحديدات الاتجاهية موضعي المرساة والمؤشر المستقلين ويمكن ضبطهما أو الاستعلام عنهما بوحدات ترميز UTF-16 أو نقاط ترميز Unicode أو عناقيد grapheme موسعة يحفظ التحرير ثنائي الاتجاه الترتيب المنطقي لقيمة الحقل بينما يحسم خانات المؤشر البصرية لكل سطر من مستويات التضمين، فتتبع الحركة الفيزيائية لليسار واليمين النص المختلط من اليسار إلى اليمين ومن اليمين إلى اليسار ترسل استبدالات التحديد

/V إلى المضيف، وتكشف النص المحدد والبديل عبر /F، وتفرض

DisplayValue عند حدود عناقيد grapheme مكتملة، وتطوي التحديد بعد تحرير مقبول واحد يحفظ كل تحرير نشط سجل دلتا مقيَّدًا يستعيد القيمة المؤقتة وقيمة العرض والتحديد الاتجاهي دون إعادة إرسال إجراءات النموذج أو دوال استدعاء تحرير المضيف يحوّل

التصريح

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;

الطرق

Createتنشئ جلسة مرفقة بنسخة مكتبة مملوكة للمستدعي
AttachLibraryتعيد ضبط كل الحالة المؤقتة وترفق نسخة مكتبة أخرى مملوكة للمستدعي، أو nil
Resetتمسح حالة التركيز والتحرير والتحديد دون تغيير قيم الحقول أو إرسال إجراءات
FocusFieldتودع التحرير الحالي أو تلغيه، وترسل /Bl لعنصر Widget السابق ثم ترسل /Fo لعنصر Widget المرئي المطلوب
GetFieldPageRectتُرجع مستطيل عنصر Widget المرئي بإحداثيات CropBox البصرية المدوَّرة دون تغيير الصفحة المحددة
HitTestتُرجع عنصر Widget المرئي الأعلى عند نقطة صفحة بصرية، مع اعتبار المدخلات اللاحقة في مصفوفة /Annots للصفحة الإصابة الأمامية
GetTabSequenceتُرجع عناصر Widget المرئية عبر الصفحات بترتيب الصفحات وتطبق دلالات /Tabs /R و/C و/S و/A و/W الخاصة بـ PDF 2.0 ودوران الصفحة و/Direction في ViewerPreferences؛ وتستخدم قيمة /Tabs الناقصة أو غير الصالحة ترتيب مصفوفة التعليقات التوضيحية
FocusAtتجري اختبار إصابة لنقطة صفحة بصرية وتركز عنصر Widget المُرجع عبر مسار الإجراء الاعتيادي للإيداع والتبديد والتركيز
FocusNextتتحرك أمامًا أو خلفًا عبر تسلسل الجدولة المحسوب مع دوران اختياري وقواعد انتقال التركيز الاعتيادية
Blurتودع التحرير الحالي أو تلغيه وترسل /Bl قبل مسح التركيز
BeginEditتركز حقل نص أو اختيار قابلًا للتحرير وتلتقط لقطة لقيمته الأصلية
SetEditValueتحدّث القيمة المؤقتة وتفرض الحد الأقصى المضبوط لطول حقل النص دون قسمة عنقود grapheme موسع
SetSelectionتقيّد وتخزن مدى تحديد UTF-16 ذات أساس صفر ضمن القيمة المؤقتة
SetSelectionRangeتقيّد موضعي المرساة والمؤشر الاتجاهيين بوحدة الفهرس المطلوبة وتحوّلهما إلى مدى UTF-16 الداخلي ولا تقسم أبدًا نقطة ترميز أو عنقود grapheme عند استخدام أي من وحدتي Unicode
GetSelectionRangeتُرجع المرساة والمؤشر والبداية والطول المطبَّعين بوحدة الفهرس المطلوبة مع الاتجاه الأصلي
SetTextDirectionتختار اتجاه فقرة تلقائيًا أو صراحةً من اليسار إلى اليمين أو صراحةً من اليمين إلى اليسار وتُبطل ترتيب المؤشر البصري المخزن مؤقتًا
GetVisualCaretOrderتُرجع فهارس مؤشر منطقية آمنة مع عناقيد grapheme بالترتيب الفيزيائي من اليسار إلى اليمين، بما في ذلك خانات الانقسام المميزة عند حدود الاتجاه المختلط
MoveVisualCaretتحرك أو تمدد التحديد الاتجاهي خانة بصرية فيزيائية واحدة وتطوي التحديدات القائمة نحو الحافة الفيزيائية المطلوبة
GetSelectedTextتُرجع نص UTF-16 المحدد حاليًا أو سلسلة فارغة
ReplaceSelectionتستبدل التحديد المطبَّع عبر معاملة واحدة قابلة للنقض تجمع /K وOnTextEdit، ثم تطوي المؤشر بعد الاستبدال المقبول
CutSelectionتُرجع النص المحدد وتزيله عبر مسار الاستبدال الذري نفسه
PasteTextتستبدل التحديد الحالي بنص حافظة يوفره المستدعي دون إدخال اعتماد على حافظة منصة
CanUndoEditتبلغ مما إذا كان للتحرير النشط مدخل سجل قابل للعكس
CanRedoEditتبلغ مما إذا كان للتحرير النشط مدخل سجل معكوس قابل لإعادة التنفيذ
UndoEditتعكس آخر تحرير محتفظ به وتستعيد تحديده الاتجاهي السابق
RedoEditتعيد تنفيذ التحرير التالي المحتفظ به وتستعيد تحديده الاتجاهي الناتج
ClearEditHistoryتتجاهل سجل التراجع والإعادة للتحرير النشط دون تغيير قيمته الحالية أو تحديده
DispatchInputEventترسل حدث مؤشر أو عجلة أو مفتاح أو نص مركّب واحدًا محايد المنصة وتُرجع حالة التركيز والتحويم والضغط والقيمة والتحديد الناتجة
CommitEditتتحقق من مرشح وتنسقه قبل تخزين قيمته الخام، وتحدّث المظهر المنسق ثم تُطلق OnValueChanged
CancelEditتتجاهل القيمة المؤقتة والتحديد دون تغيير الحقل

خصائص الحالة

LibraryInstanceنسخة TPDFlib الحالية غير المملوكة
FocusedFieldIndexفهرس الحقل أو عنصر Widget المؤقت المركز عليه، أو الصفر عندما لا يكون أي عنصر Widget مركزًا عليه
EditingFieldIndexحقل النص أو الاختيار الأساسي قيد التحرير، أو الصفر عندما لا يكون هناك تحرير نشط
OriginalValueقيمة الحقل التي التقطها BeginEdit
EditValueالقيمة المؤقتة الحالية
DisplayValueقيمة التحرير الحالية أو قيمة العرض المنسقة التي أنتجها آخر إيداع ناجح
SelectionStartفهرس البداية ذو الأساس صفر بترميز UTF-16
SelectionLengthطول التحديد بترميز UTF-16
SelectionAnchorموضع المرساة ذو الأساس صفر بترميز UTF-16 الذي يبقى ثابتًا بينما يمدد المؤشر تحديدًا اتجاهيًا
SelectionCaretالحافة المتحركة للتحديد الاتجاهي ذات الأساس صفر بترميز UTF-16
TextDirectionالاتجاه المضبوط، وافتراضه ftdAuto ويُحفظ عبر التحريرات في الجلسة
ResolvedTextDirectionالاتجاه الصريح أو الاتجاه التلقائي المختار من أول محرف قوي في قيمة التحرير النشطة
VisualCaretPositionالخانة الحالية في ترتيب المؤشر الفيزيائي المخزن مؤقتًا، أو -1 عندما لم تختر أي حركة بصرية خانة
MaxUndoStepsالحد الأقصى لمدخلات سجل التحرير المحتفظ بها من 0 إلى 10000؛ والافتراضي 1000 والصفر يعطل التسجيل
UndoEditCountعدد المدخلات المحتفظ بها المتاحة حاليًا لـ UndoEdit
RedoEditCountعدد المدخلات المحتفظ بها المتاحة حاليًا لـ RedoEdit
ModifiedTrue عندما يختلف EditValue عن OriginalValue
HoveredFieldIndexعنصر Widget ذو حالة دخول مؤشر نشطة حاليًا، أو الصفر
PressedFieldIndexعنصر Widget المحتفظ بالتقاط المؤشر الأساسي حتى الرفع المطابق أو إلغاء المؤشر، أو الصفر

الأحداث

OnActionتستقبل TPDFlibActionInfo موصوفة بالنوع لإجراءات التركيز والتبديد وضربات المفاتيح والتحقق والتنسيق المتاحة؛ واضبط Allow إلى False لنقض العملية المعلقة
OnFocusChangedتبلغ عن كل انتقال تركيز مكتمل، بما في ذلك الانتقالات إلى الصفر بعد نقض إجراء تركيز جديد
OnValueChangedتبلغ عن تغيير قيمة مودَع بنجاح بعد تحديث الحقل ومظاهره المتغيرة
OnTextEditتستقبل نوع التحرير وتحديد UTF-16 والنص المحدد والاستبدال القابل للتغيير قبل تغير القيمة المؤقتة؛ واضبط Allow إلى False للرفض الذري

القيمة المُرجعة

تُرجع الدوال المغيرة للحالة 1 عند النجاح و0 عندما يكون الطلب غير صالح أو معاود الدخول أو منقوضًا أو لا يمكن إيداعه؛ وتُرجع HitTest فهرس حقل أو عنصر Widget مؤقت وتُرجع GetTabSequence عدد المدخلات

وحدات الاختيار

يحفظ fsuUTF16CodeUnit عقد فهرسة WideString القديم ذا الأساس صفر، بما في ذلك المواضع داخل زوج بديل عند طلبها صراحةً تعد

fsuUnicodeCodePoint الزوج البديل الصالح نقطة ترميز تكميلية واحدة وتعامل البديل غير المقترن نقطة ترميز مستقلة واحدة تعد

يعد fsuGraphemeCluster عناقيد المحارف الممتدة الكاملة فتبقى تسلسلات الدمج والرموز التعبيرية المتصلة غير قابلة للتجزئة

تخزن جداول حدود Unicode لقيمة التحرير الحالية وتبطل عندما تتغير تلك القيمة

التنقل ثنائي الاتجاه

يستخدم ftdAuto أول محرف قوي ويعتمد الاتجاه من اليسار إلى اليمين افتراضيًا عندما يخلو التحرير من محرف اتجاهي قوي

يحسم الترتيب البصري للجولات باستقلال لكل سطر ولا يغير قيمة حقل UTF-16 المنطقية ولا سلسلة PDF ولا محاذاة النص

VisualCaretPosition الحركة المتكررة عبر ذلك الحد

مثال

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;

انظر أيضًا

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