Я думаю, вы делаете логическую ошибку: кнопки не перемещаются при прокрутке сетки,Хотя может показаться, что они перемещаются, это всего лишь результат перемещения содержимого контекста устройства из-за внутреннего вызова ScrollWindow
.Полосы прокрутки в компоненте сетки строк добавляются пользователем и работают не так, как, например, TScrollBox
.
Чтобы всегда отображать все кнопки в тех местах, где они действительно находятся, перекрасьте сетку строк вOnTopLeftChanged
событие:
procedure TForm1.StringGrid1TopLeftChanged(Sender: TObject);
begin
StringGrid1.Repaint;
end;
Если высота строк всех строк и высота сетки строк никогда не изменяются, то достаточно создать все кнопки только один раз и оставить их на месте.Это означает, что каждая кнопка больше не «привязана» к строке, и сохранение их в свойстве Objects
больше не имеет значения.Когда кнопка нажата, просто рассчитайте предполагаемый индекс строки из положения кнопки в сочетании со свойством TopRow
в сетке строк, которое указывает индекс первой видимой прокручиваемой строки в сетке.
Если размер сетки можно изменить, например, с помощью якорей, обновите количество кнопок в событии OnResize родительского элемента.И если количество строк в сетке строк может стать меньше, чем максимальное количество видимых строк, то также обновите количество (видимых) кнопок.
Если вы хотите получить больше ответов, обновите свой вопрос и объяснитекак вызываются процедуры MoveRowPlus
и MoveRowMinus
из-за взаимодействия с сеткой и / или кнопками, потому что теперь я не до конца понимаю, что вам нужно.
А что касается CellRect
неправильные координаты: это потому, что CellRect
работает только на полных (или частичных) видимых ячейках.Цитировать документацию :
Если указанная ячейка не видна, CellRect
возвращает пустой прямоугольник.