2016-09-02 2 views
-3

J'ai un dbgrid. Je veux mettre l'accent sur le courant CELL quand j'obtiens erreur sur datachanged événement dans mon DataSource.delphi DBGrid mettre l'accent sur la cellule actuelle

Mon code en cas OndataChanged est:

if (Field.Text = '') then 
begin     

     Application.MessageBox('ERROR','',MB_ICONWARNING); 
     Field.Tag:= Field.DataSet.RecNo; 
     Abort; 
end 

Comment puis-je faire?

+1

a) L'événement est-dataChanged étant déclenché par l'utilisateur effectuant le montage en place dans la grille? b) Qu'entendez-vous par cellule "actuelle" - la cellule qui a été focalisée immédiatement avant que vous obteniez l'erreur ou quoi? – MartynA

+0

a) il y a un événement 'OnDataChanged' dans ma source de données ... b) la cellule courante: est la cellule quand je mets une mauvaise donnée – userPro

+0

b) exemple: quand je clique sur la cellule suivante avec la souris .. je reçois erreur: l'ancienne cellule ne peut pas être un format .. – userPro

Répondre

1

Le code ci-dessous montre comment

  • Installer un gestionnaire global d'exception

  • Mise au point une cellule donnée dans un DBGrid, par exemple celui qui était courant lorsqu'une exception s'est produite. Voir FocusGridCell

  • Définissez la propriété Required de TField sur True, ce que Ken White vous a suggéré de faire.

Comme vous pouvez le voir, OnException de TForm1 enregistre la ligne de la grille actuelle et de la colonne en les variables ERow et Ecol vous pouvez donc y revenir plus tard.

FocusGridCell vous permet de renvoyer le focus à la cellule de grille avec les valeurs ERow et ECol enregistrées après que la mise au point a été retirée de la grille, par ex. par le Application.MessageBox dans votre gestionnaire OnDataChange.

J'espère que cela devrait être tout ce dont vous avez besoin pour faire ce que vous voulez faire.

BTW, il est généralement une mauvaise idée d'utiliser des messages pop-up pour afficher des trucs en gestionnaires d'événements TDataSet: il est préférable de vous envoyer un message personnalisé à la file d'attente de messages de l'application et de faire le pop-up dans la gestionnaire de message personnalisé, de sorte que la pop-up se produira après l'événement de jeu de données est terminée.

code:

TForm1 = class(TForm) 
    [...] 
    protected 
    ERow, 
    ECol : Integer; 
    procedure OnException(Sender : TObject; E : Exception); 
    procedure FocusGridCell(ACol, ARow: Integer); 
    public 
    end; 

[...] 

type 
TMyDBGrid = class(TDBGrid); 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ERow := -1; 
    ECol := -1; 
    Application.OnException := OnException; 
end; 

procedure TForm1.OnException(Sender: TObject; E: Exception); 
begin 
    ERow := TMyDBGrid(DBGrid1).Row; 
    ECol := TMyDBGrid(DBGrid1).Col; 
    // the following shows a non-intrusive way to display status info without 
    // interfering with what's focused on the form, etc 
    Caption := Format('Row: %d, Col: %d', [ERow, ECol]); 
end; 

procedure TForm1.FocusGridCell(ACol, ARow : Integer); 
begin 
    // Unless the grid's dgAlwaysShowSelection is True, the following 
    // call to DBGrid1.SetFocus is necessary, otherwise 
    // the call to SetFocus has no visible effect. 
    if not (dgAlwaysShowSelection in DBGrid1.Options) then 
    DBGrid1.SetFocus; 
    TMyDBGrid(DBGrid1).FocusCell(ACol, ARow, True); 
end; 
+0

Je reçois 'TMyDBGrid (DBGrid1) .FocusCell (ACol, ARow, True); 'identificateur non déclaré FocusCell – userPro

+1

@userPro: Quelle version de Delphi utilisez-vous? – MartynA

+0

"identificateur non déclaré FocusCell" Assurez-vous que votre unité utilise les grilles ainsi que DBGrids. Cela devrait être fait automatiquement. 'FocusCell' est une méthode de portée protégée de TCustomGrid et la déclaration' TMyDBGrid' dans mon code devrait permettre l'accès au compilateur dans votre unité. – MartynA