Sie sollten die Funktionen verwenden, die der Datensatz (in diesem Fall TTable) Ihnen bereits gibt, anstatt zu versuchen, das Rad neu zu erfinden. TDataSet stellt ein Ereignis (OnBeforePost) bereit, das speziell für diesen Zweck entwickelt wurde.
Klicken Sie auf Ihre TTable
, und wechseln Sie dann im Objektinspektor zur Registerkarte Ereignisse. Suchen Sie das Ereignis OnBeforePost
und doppelklicken Sie darauf, um die Ereignisshell im Quelltext-Editor zu generieren. Sie werden etwas sehen:
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
// DataSet is the TDataSet (TTable, TQuery, TADOQuery, etc.) to which
// event is attached
end;
Sie können vor einem Datensatz benötigt, um alle Ihre Validierungen tun, ist hier in die Datenbank tatsächlich geschrieben. Zum Beispiel, wenn Sie jedes einzelne Feld hat etwas in ihm, um sicherzustellen, möchten, können Sie dies tun:
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;
Wenn Sie sicher, dass nur bestimmte Felder Werte machen wollen, oder dass der Wert innerhalb eines bestimmten Bereichs , können Sie das Feld direkt zugreifen:
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;
Jetzt nicht haben Sie etwas überhaupt in Ihrem TDBGrid zu tun. Wenn der Benutzer DownArrow in der letzten Zeile trifft und eine neue Zeile eingefügt wird und sie unvollständige oder falsche Daten eingeben, werden die obigen Ereignisse dafür sorgen. Sie funktionieren auch, wenn Sie zwei Schaltflächen verwenden (eine zum Einfügen oder Bearbeiten und die andere zum Posten), da die Ereignisse alles andere behandeln.
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;
Sie benötigen die Zeile Bearbeiten nicht. Nach dem Anfügen befindet sich die Tabelle im Status "dsinsert" und Sie können Werte zuweisen. Sie müssen die Tabelle auch nicht im dsedit-Zustand vor dem Löschen setzen. –
Bitte konkretisieren Sie Ihr Problem: Sie können alle Felder im Vorpost-Ereignis füllen oder im After-Event-Ereignis Felder auf vordefinierte Werte setzen. Was bedeutet leere Zelle? Sie können Datensätze aus dem Grid im Ereignis ondrawdatacell ausschließen oder Sie können das Vorpost-Ereignis einchecken, wenn alle Felder ausgefüllt sind (<> NULL hängt von Ihrer Datenbank ab) –
** Ich habe eine Schaltfläche zum Hinzufügen einer neuen Zeile in meinem DBGRID : ** Sie können dieses 'Knopf OnClick-Ereignis' verwenden, um die Gültigkeit der Daten zu übernehmen. 'No valid Data' no 'MessageTable.Append' ..... Warum' MessageTable.Append' mit ungültigen Daten aufrufen? Und fangen Sie es in 'beforePost event' sinnlos ab. –