我需要知道何时更改了网格的行/列属性才能进行一些处理。
在TStringGrid行属性是


property Row: Longint read FCurrent.Y write SetRow;



但是,不幸的是,我无法覆盖SetRow,因为它是私有的。 SelectCell不是私有的,但是在设置新的column和row属性之前,它被称为。唯一的解决方案是将所有对Row属性的调用替换为我自己的属性


property MyRow: Longint read Row write SetMyRow;



但这不是最优雅的解决方案。
有任何想法吗?



Delphi 7,Win 7 32位

最佳答案

我只是看了TStringGrid的来源。 Row属性是从TCustomGrid继承的(通过TDrawGridTCustomDrawGrid定义),

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;


因此,每次更改OnSelectCellRow时,都会调用Col,如Skamradt在评论中所写。

是的,在选择新单元格之前会调用此事件,但是我们有

FOnSelectCell: TSelectCellEvent;


哪里

type
  TSelectCellEvent = procedure (Sender: TObject; ACol, ARow: Longint;
var CanSelect: Boolean) of object;


AColARow包含新的“将来的值”。您甚至可以通过将CanSelect设置为false来禁止更改选定的单元格。因此,无需覆盖任何内容。

(此外,您不能覆盖SetRow,因为它不是虚拟的。很有可能覆盖私有成员和受保护的成员,但只能覆盖虚拟方法。)

关于delphi - TColumnGrid的OnColumnChanged和OnRowChanged事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3981639/

10-12 21:16