如何获取具有滚动条的每个组件的滚动偏移量?

How get scroll offset of each component that has a scroll bar?

有人问我: 如何获取每个具有滚动条的组件的滚动偏移量以及如何获取组件可见部分上某些项目(可能是 TListBox 中的 TListBoxitem)的坐标 - 显示当前项目的 TPopup 的示例?

Popup.Position.X:= ListBox.ItemByIndex(0).Position.X;
Popup.Position.Y:= ListBox.ItemByIndex(0).Position.Y;

此代码在 Item(0) 的左上角显示 TPopup 并且可见。

何时可见 Item(100) TPopup 不在左上角且不可见:

Popup.Position.X:= ListBox.ItemByIndex(100).Position.X;
Popup.Position.Y:= ListBox.ItemByIndex(100).Position.Y;

如何让 TPopup 在每个项目的左上角可见?

答案很简单(以 TListBox 为例):

var
  offsetX, offsetY: single;
begin
  offsetX:= myListBox.ViewportPosition.X;
  offsetY:= myListBox.ViewportPosition.Y;
end;

以及如何在每个项目的左上角显示可见的 TPopup:

Popup.Position.X:= ListBox.ItemById(0).Position.X - ListBox.ViewportPosition.X;
Popup.Position.Y:= listBox.ItemById(0).Position.Y - ListBox.ViewportPosition.Y;
.
.
.
Popup.Position.X:= ListBox.ItemById(100).Position.X - ListBox.ViewportPosition.X;
Popup.Position.Y:= listBox.ItemById(100).Position.Y - ListBox.ViewportPosition.Y;