Vous devez utiliser les fonctionnalités que l'ensemble de données (dans ce cas, TTable) vous donne déjà au lieu d'essayer de réinventer la roue. TDataSet fournit un événement (OnBeforePost) spécialement conçu à cet effet.
Cliquez sur votre TTable
, puis basculez vers l'onglet Evénements dans l'inspecteur d'objets. Recherchez l'événement OnBeforePost
et double-cliquez dessus pour générer le shell d'événements dans l'éditeur de code. Vous verrez quelque chose comme ceci:
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
// DataSet is the TDataSet (TTable, TQuery, TADOQuery, etc.) to which
// event is attached
end;
Vous pouvez faire toutes vos validations nécessaires avant qu'un enregistrement est en fait écrit à la base de données ici. Par exemple, si vous voulez vous assurer que chaque champ unique a quelque chose, vous pouvez le faire:
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
var
i: Integer;
begin
// You can replace DataSet with your actual table variable name, but using it
// this way allows you to use this same event for more than one table if you want.
for i := 0 to DataSet.FieldCount - 1 do
if DataSet.Fields[i].IsNull then
raise Exception.CreateFmt('Field %s has no value', DataSet.Fields[i].FieldName);
end;
Si vous voulez vous assurer que seuls certains champs ont des valeurs, ou que la valeur est dans une certaine plage , vous pouvez accéder au champ directement:
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
if DataSet.FieldByName('MyField').IsNull then
Abort; // This silently cancels the post without telling the user
if DataSet.FieldByName('AField').AsInteger = 0 then
raise Exception.Create('AField must not be 0');
end;
maintenant, vous ne devez pas faire quoi que ce soit dans votre TDBGrid. Si l'utilisateur tape DownArrow sur la dernière ligne et qu'une nouvelle ligne est insérée, et qu'ils entrent des données incomplètes ou erronées, les événements ci-dessus s'en occuperont. Ils fonctionneront également si vous utilisez deux boutons (un pour insérer ou modifier et l'autre pour publier), car les événements géreront tout le reste.
procedure TForm1.ButtonInsertClick(Sender: TObject);
begin
Table1.Insert; // Or Append - if you have an index on the table they're the same thing
end;
procedure TForm1.ButtonPostClick(Sender: TObject);
begin
Table1.Post; // This is 100% of the code you need here
end;
Vous n'avez pas besoin de la ligne d'édition. Après l'ajout, la table est dans l'état dsinsert et vous pouvez assigner des valeurs. Vous n'avez pas non plus besoin de définir la table dans l'état dsedit avant de supprimer –
Veuillez préciser votre problème: vous pouvez remplir tous les champs de l'événement beforepost ou définir des champs avec des valeurs prédéfinies dans l'événement afterinsert. Que signifie cellule vide? vous pouvez exclure des enregistrements de données de la grille dans l'événement ondrawdatacell ou vous pouvez vérifier l'événement beforepost si tous les champs sont remplis (<> NULL dépend de votre base de données) –
** J'ai un bouton pour ajouter une nouvelle ligne dans mon DBGRID : ** Vous pouvez utiliser ce 'bouton OnClick event' faire toute la validité des données. 'Aucune donnée valide' non' MessageTable.Append' ..... Pourquoi appeler 'MessageTable.Append' avec des données non valides? Et l'attraper dans 'événement beforePost 'inutile. –