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 |
| Modified | True عندما يختلف 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