property HasFormFieldAt[X, Y: Single]: Boolean; // read only
HasFormFieldAt выполняет hit-test на текущей активной странице: возвращает True, когда заданная координата (X, Y) попадает внутрь прямоугольника любой widget-аннотации. Координаты — в пользовательском пространстве PDF, той же системе, что у PageWidth / PageHeight: начало внизу слева, X растёт вправо, Y — вверх, единицы — пункты (1/72 дюйма)
Свойство возвращает False, когда Active равно False, когда в документе нет виджетов AcroForm или когда переданная координата проходит мимо всех прямоугольников виджетов. Это обёртка постоянного времени над FPDFPage_HasFormFieldAtPoint из PDFium — идеально для feedback при mouse-move / hover во вьювере, где значение запрашивается много раз в секунду
Hit-test учитывает только прямоугольник виджета — не границы appearance. Кнопки или чекбоксы, чей видимый глиф меньше прямоугольника виджета, всё равно дают True на всём прямоугольнике. В паре с FormFieldInfoAt[X, Y]: как только hit-test подтвердил, что курсор над полем, получайте запись найденного поля — этот паттерн избавляет от более тяжёлого запроса данных на каждом mouse-move
TPdfView.DeviceToPage или примените обратные смещения Zoom / скролла сами, прежде чем вызывать свойствоFormFieldInfoAt
procedure TForm1.PdfView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var PageX, PageY: Double;
begin
PdfView1.DeviceToPage(X, Y, PageX, PageY);
if Pdf1.HasFormFieldAt[PageX, PageY] then
PdfView1.Cursor := crHandPoint
else
PdfView1.Cursor := crDefault;
end;