2010-10-20 5 views
2

J'ai besoin de savoir quand la propriété de ligne/colonne d'une grille a été modifiée pour effectuer un traitement. En TStringGrid propriété Row estEvénements OnColumnChanged et OnRowChanged à TStringGrid

property Row: Longint read FCurrent.Y write SetRow; 

Mais, malheureusement, je ne peux pas passer outre le setrow comme il est privé. SelectCell n'est pas privé MAIS il s'appelle BEFORE le nouvel attribut column et row est défini. La seule solution sera de remplacer tous les appels à la rangée propriété avec ma propriété

property MyRow: Longint read Row write SetMyRow; 

mais ce n'est pas la solution la plus élégante. Des idées?


Delphi 7, Windows 7 32 bits

+2

DelphiXE a un événement onSelectCell qui fait juste ce. Malheureusement, Delphi 7 n'est pas disponible pour vérifier si elle était disponible dans cette version ou non. – skamradt

+0

TStringGrid a un événement OnSelectCell dans toutes les versions de Delphi, AFAIK. –

+0

@Remy: En effet. Pour une chose, ce serait très étrange sinon. Deuxièmement, quand cette composante a-t-elle été mise à jour? Il a vraiment l'ancien aspect Win 9x ... –

Répondre

4

Je viens d'avoir un coup d'oeil à la source de TStringGrid. La propriété est héritée de TCustomGrid (via TDrawGrid et TCustomDrawGrid), où il est défini comme

property Row: Longint read FCurrent.Y write SetRow; 

comme vous le dites. SetRow appelle FocusCell qui appelle MoveCurrent. Celui-ci appelle SelectCell. Ceci est une fonction virtuelle, et même si elle est très trivial dans TCustomGrid, où il est défini comme

function TCustomGrid.SelectCell(ACol, ARow: Longint): Boolean; 
begin 
    Result := True; 
end; 

à TCustomDrawGrid, nous avons

function TCustomDrawGrid.SelectCell(ACol, ARow: Longint): Boolean; 
begin 
    Result := True; 
    if Assigned(FOnSelectCell) then FOnSelectCell(Self, ACol, ARow, Result); 
end; 

Par conséquent, OnSelectCell est appelé à chaque fois que ou Col est changé, comme Skamradt a écrit dans un commentaire.

Oui, cet événement est appelé avant que la nouvelle cellule est sélectionnée, mais nous avons

FOnSelectCell: TSelectCellEvent; 

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

ACol et ARow contiennent les nouvelles valeurs « à être ». Vous pouvez même interdire la modification de la cellule sélectionnée en définissant CanSelect sur false. Par conséquent, il n'y a pas besoin de surcharger quoi que ce soit.

(En outre, vous ne pouvez pas remplacer SetRow car il ne virtuel. Il est possible de remplacer les membres privés et protégés, mais seulement des méthodes virtuelles peut passer outre.)

+0

Merci Andreas! Accepté. – Ampere