Я только что посмотрел на источник TStringGrid
. Свойство Row
наследуется от TCustomGrid
(через TDrawGrid
и TCustomDrawGrid
), где оно определяется как
property Row: Longint read FCurrent.Y write SetRow;
как ты говоришь. SetRow
звонит FocusCell
который звонит MoveCurrent
. Этот называет SelectCell
. Это виртуальная функция, и хотя она очень тривиальна в TCustomGrid
, где она определена как
function TCustomGrid.SelectCell(ACol, ARow: Longint): Boolean;
begin
Result := True;
end;
в TCustomDrawGrid
, у нас есть
function TCustomDrawGrid.SelectCell(ACol, ARow: Longint): Boolean;
begin
Result := True;
if Assigned(FOnSelectCell) then FOnSelectCell(Self, ACol, ARow, Result);
end;
Следовательно, OnSelectCell
вызывается каждый раз, когда Row
или Col
изменяется, как Скамрадт написал в комментарии.
Да, это событие вызывается до выбора новой ячейки, но у нас есть
FOnSelectCell: TSelectCellEvent;
, где
type
TSelectCellEvent = procedure (Sender: TObject; ACol, ARow: Longint;
var CanSelect: Boolean) of object;
ACol
и ARow
содержат новые "возможные значения". Вы даже можете запретить изменение выбранной ячейки, установив CanSelect
в false
. Следовательно, нет необходимости переопределять что-либо.
(Кроме того, вы не можете переопределить SetRow
, потому что это не виртуальный . Очень возможно переопределить частные и защищенные члены, но могут быть переопределены только виртуальные методы.)