События OnColumnChanged и OnRowChanged для TStringGrid - PullRequest
2 голосов
/ 20 октября 2010

Мне нужно знать, когда свойство строки / столбца сетки было изменено, чтобы выполнить некоторую обработку. В TStringGrid Row свойство имеет значение

property Row: Longint read FCurrent.Y write SetRow;

Но, к сожалению, я не могу переопределить SetRow, поскольку он является приватным. SelectCell не является частным, НО его называют ДО установки нового столбца и атрибута строки. Единственным решением будет заменить все вызовы свойства Row своим собственным свойством

property MyRow: Longint read Row write SetMyRow;

но это не самое элегантное решение. Есть идеи?


Delphi 7, Win 7 32 бит

1 Ответ

4 голосов
/ 21 октября 2010

Я только что посмотрел на источник 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, потому что это не виртуальный . Очень возможно переопределить частные и защищенные члены, но могут быть переопределены только виртуальные методы.)

...