TDrawGrid
- это нарисованный владельцем компонент.Он не отслеживает какие-либо данные на ячейку, поэтому вы не можете найти ничего, связанного с этим (в отличие от TStringGrid
, который отслеживает строки и указатели объектов для вас на ячейку в пределах его * 1003).* property).
При необходимости вам придется отслеживать ваши собственные данные о состоянии каждой ячейки в вашем собственном коде.Используя событие OnDrawCell
, нарисуйте каждую ячейку в соответствии с ее текущим состоянием.Не пытайтесь рисовать что-либо на сетке вне этого события.
Например, вы можете выделить 2-мерный массив для хранения данных вашей ячейки, где каждый элемент отслеживает, является ли ячейка пустой или содержит(кусок) плитки.Затем, внутри события OnDrawCell
, используйте предоставленные параметры Row
и Col
для индексации в массиве, чтобы получить текущее состояние ячейки, а затем нарисуйте ячейку по мере необходимости.
В качестве альтернативы, если вывместо этого сохраните список активных плиток, вы можете хранить информацию о строках / столбцах для каждой плитки.Затем внутри события OnDrawCell
вы можете найти плитку, которая покрывает указанную Row
/ Col
, и, если она найдена, нарисуйте эту (часть) плитки внутри ячейки, в противном случае нарисуйте (эту часть) фон вместо.
В любом случае, всякий раз, когда вы «перемещаете» плитку, обновляйте соответствующие элементы массива / списка по мере необходимости, а затем Invalidate()
всю сетку (или, по крайней мере, InvalidateCell()
затронутых ячеек) для запускаперекрас.
При этом вы могли бы рассмотреть возможность использования TPaintBox
вместо TDrawGrid
.Используя событие OnPaint
, вы можете рисовать все, что захотите, где угодно.Ведение списка активных плиток и их текущих координат x / y, а затем просто отрисовка всех активных плиток при срабатывании OnPaint
упрощает управление, не беспокоясь о гранулярности работы с отдельными ячейками.