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;
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
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
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