我需要知道何时更改了网格的行/列属性才能进行一些处理。
在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
继承的(通过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
,如Skamradt在评论中所写。是的,在选择新单元格之前会调用此事件,但是我们有
FOnSelectCell: TSelectCellEvent;
哪里
type
TSelectCellEvent = procedure (Sender: TObject; ACol, ARow: Longint;
var CanSelect: Boolean) of object;
ACol
和ARow
包含新的“将来的值”。您甚至可以通过将CanSelect
设置为false
来禁止更改选定的单元格。因此,无需覆盖任何内容。(此外,您不能覆盖
SetRow
,因为它不是虚拟的。很有可能覆盖私有成员和受保护的成员,但只能覆盖虚拟方法。)关于delphi - TColumnGrid的OnColumnChanged和OnRowChanged事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3981639/